الفرق بين المراجعتين لصفحة: «Ruby/BasicObject»
لا ملخص تعديل |
جميل-بيلوني (نقاش | مساهمات) ط إضافة القسم "توابع الصنف العامة" الناقص. |
||
(4 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE: | <noinclude>{{DISPLAYTITLE:الصنف <code>BasicObject</code> في روبي | ||
}}</noinclude>[[تصنيف: Ruby]] | }}</noinclude> | ||
[[تصنيف: Ruby | [[تصنيف: Ruby]] | ||
[[تصنيف: Ruby | [[تصنيف: Ruby Class]] | ||
الصنف <code>BasicObject</code>هو الصنف الأب لجميع الأصناف في روبي، وهو صنف فارغ. | [[تصنيف: Ruby BasicObject]] | ||
الصنف <code>BasicObject</code> هو الصنف الأب لجميع الأصناف في روبي، وهو صنف فارغ. | |||
يمكن استخدام الصنف <code>BasicObject</code> لإنشاء هرميات كائنية (object hierarchies) مستقلة عن الهرمية الكائنية للغة روبي، أو لإنشاء مغلفات الكائنات (proxy objects) مثل الصنف <code>Delegator</code>، أو حيث يجب تجنب إفساد مجال الأسماء (namespace pollution) من قبل توابع وأصناف روبي. | يمكن استخدام الصنف <code>BasicObject</code> لإنشاء هرميات كائنية (object hierarchies) مستقلة عن الهرمية الكائنية للغة روبي، أو لإنشاء مغلفات الكائنات (proxy objects) مثل الصنف <code>Delegator</code>، أو حيث يجب تجنب إفساد مجال الأسماء (namespace pollution) من قبل توابع وأصناف روبي. | ||
لتجنب إفساد الصنف <code>BasicObject</code> للمستخدمين الآخرين، يجب إنشاء صنف فرعي من الصنف <code>BasicObject</code> تحت اسم مناسب بدلاً من تعديل <code>BasicObject</code> مباشرةً: | لتجنب إفساد الصنف <code>BasicObject</code> للمستخدمين الآخرين، يجب إنشاء صنف فرعي من الصنف <code>BasicObject</code> تحت اسم مناسب بدلاً من تعديل <code>BasicObject</code> مباشرةً:<syntaxhighlight lang="ruby"> | ||
<syntaxhighlight lang="ruby"> | |||
class MyObjectSystem < BasicObject | class MyObjectSystem < BasicObject | ||
end | end | ||
</syntaxhighlight>لا يتضمَّن الصنف <code>BasicObject</code> الوحدة <code>Kernel</code> (التي تضم توابعًا مثل <code>puts</code>)، كما أنَّ الصنف <code>BasicObject</code> موجود خارج مجال الأسماء الخاص بالمكتبة القياسية (standard library)، لذا لن يُعثَر على الأصناف الشائعة دون استخدام مسار الصنف بأكمله. | </syntaxhighlight>لا يتضمَّن الصنف <code>BasicObject</code> الوحدة <code>Kernel</code> (التي تضم توابعًا مثل <code>puts</code>)، كما أنَّ الصنف <code>BasicObject</code> موجود خارج مجال الأسماء الخاص بالمكتبة القياسية (standard library)، لذا لن يُعثَر على الأصناف الشائعة دون استخدام مسار الصنف بأكمله. | ||
يمكن استخدام عدة استراتيجيات لجعل أجزاء من المكتبة القياسية متاحةً في الأصناف المتفرِّعة من الصنف <code>BasicObject</code>. يستطيع صنف فرعي أن يُضمِّن الصنف <code>Kernel</code> لأجل الحصول توابع مثل <code>puts</code> و <code>exit</code> وغيرهما. يمكن إنشاء وتضمين وحدة (module) مُخصصة مشابهة للوحدة <code>Kernel</code>، أو يمكن استخدام التفويض (delegation) عبر | يمكن استخدام عدة استراتيجيات لجعل أجزاء من المكتبة القياسية متاحةً في الأصناف المتفرِّعة من الصنف <code>BasicObject</code>. يستطيع صنف فرعي أن يُضمِّن الصنف <code>Kernel</code> لأجل الحصول توابع مثل <code>puts</code> و <code>exit</code> وغيرهما. يمكن إنشاء وتضمين وحدة (module) مُخصصة مشابهة للوحدة <code>Kernel</code>، أو يمكن استخدام التفويض (delegation) عبر <code>method_missing</code>:<syntaxhighlight lang="ruby">class MyObjectSystem < BasicObject | ||
class MyObjectSystem < BasicObject | |||
DELEGATE = [:puts, :p] | DELEGATE = [:puts, :p] | ||
سطر 30: | سطر 26: | ||
end | end | ||
</syntaxhighlight>يمكن للأصناف الفرعية للصنف <code>BasicObject</code> الوصول إلى أصناف ووحدات من المكتبة القياسية للغة روبي وذلك عبر الإشارة إلى الثابت المطلوب من الجذر مباشرةً، مثل <code>::File</code> أو <code>::Enumerator</code>. | </syntaxhighlight>يمكن للأصناف الفرعية للصنف <code>BasicObject</code> الوصول إلى أصناف ووحدات من المكتبة القياسية للغة روبي وذلك عبر الإشارة إلى الثابت المطلوب من الجذر مباشرةً، مثل <code>::File</code> أو <code>::Enumerator</code>. | ||
يمكن استخدام <code>const_missing</code> لتفويض (delegate) البحث عن الثوابت إلى الكائن <code>Object</code> مثل <code>method_missing</code> تمامًا:<syntaxhighlight lang="ruby"> | يمكن استخدام <code>const_missing</code> لتفويض (delegate) البحث عن الثوابت إلى الكائن <code>Object</code> مثل <code>method_missing</code> تمامًا:<syntaxhighlight lang="ruby">class MyObjectSystem < BasicObject | ||
class MyObjectSystem < BasicObject | |||
def self.const_missing(name) | def self.const_missing(name) | ||
::Object.const_get(name) | ::Object.const_get(name) | ||
سطر 37: | سطر 32: | ||
end | end | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== توابع الصنف العامة (Public Class Methods) == | |||
=== <code>[[Ruby/BasicObject/new|()new]]</code> === | |||
== توابع الكائن العامة (Public Instance Methods) == | |||
===المعامل [[Ruby/BasicObject/!-3D |<code>!=</code>]]=== | |||
يتحقق المعامل <code>[[Ruby/BasicObject/!-3D|!=]]</code> من عدم تساوي كائنين. | |||
===المعامل [[Ruby/BasicObject/! |<code>!</code>]]=== | |||
يعكس المعامل <code>[[Ruby/BasicObject/!|!]]</code> القيمة المنطقية التي تستعمل معه. | |||
===المعامل [[Ruby/BasicObject/equal |<code>==</code>]]=== | |||
يتحقق المعامل <code>[[Ruby/BasicObject/equal|==]]</code> من تساوي كائنين. | |||
===[[Ruby/BasicObject/id |<code>__id__</code>]]=== | |||
يعيد التابع <code>__id__</code> (يدعى أيضًا <code>object_id</code>) مُعرِّفا عدديًا للكائن الذي استُدعي معه. | |||
===[[Ruby/BasicObject/send |<code>__send__</code>]] === | |||
يستدعي التابع <code>__send__</code> (يدعى أيضًا <code>send</code>) التابع الممرَّر إليه مع تمرير وسائط محددة إليه. | |||
===[[Ruby/BasicObject/equal-3F |<code>equal?</code>]]=== | |||
يتحقق التابع<nowiki/>[[Ruby/BasicObject/equal-3F | <code>equal?</code>]] إذا كان الكائن الذي استُدعي معه والكائن الذي مُرّر إليه هما نفس الكائن أو يشيران إلى نفس مفتاح الخريطة (hash key). | |||
===[[Ruby/BasicObject/instance_eval |<code>instance_eval</code>]]=== | |||
يقدِّر (Evaluates) التابع <code>instance_eval</code> ناتج تنفيذ شيفرة مصدرية للغة روبي معطاة كسلسلة نصية أو ناتج كتلة برمجية (block) مُمرَّرة ضمن سياق كائن مُستقبِل (obj). | |||
===[[Ruby/BasicObject/instance_exec |<code>instance_exec</code>]]=== | |||
ينفِّذ التابع <code>instance_exec</code> الكتلة البرمجية المُمرَّرة ضمن سياق الكائن المستقبل (obj). لتعيين السياق، يُضبَط المتغير <code>self</code> إلى <code>obj</code> أثناء تنفيذ الشيفرة، مما يعطي الشيفرة إمكانية الوصول لمتغيرات النسخة <code>obj</code>. | |||
== توابع الكائن الخاصة (Private Instance Methods) == | |||
===[[Ruby/BasicObject/method_missing |<code>method_missing</code>]]=== | |||
يُستدعى هذا التابع من قِبل روبي عندما تُرسَل رسالةٌ إلى كائن لا يستطيع التعامل معها. بشكل افتراضي، يُطلق المفسِّر (interpreter) خطأً عندما يُستدعى هذا التابع. | |||
===[[Ruby/BasicObject/singleton_method_added |<code>singleton_method_added</code>]]=== | |||
يُستَدعى هذا التابع كرد نداءٍ (callback) في كلِّ مرة يُضاف فيها تابع منفرد (singleton method) جديد إلى المُستقبِل (receiver). | |||
===[[Ruby/BasicObject/singleton_method_removed |<code>singleton_method_removed</code>]]=== | |||
يُستَدعى هذا التابع كرد نداءٍ (callback) في كل مرة يُحذف فيها تابع منفرد (singleton method) من المُستقبِل (receiver). | |||
===[[Ruby/BasicObject/singleton_method_undefined |<code>singleton_method_undefined</code>]]=== | |||
يُستدعى هذا التابع كرد نداءٍ (callback) في كل مرة يكون فيها تابع منفرد (singleton method) غير مُعرَّف (undefined) في المُستقبِل (receiver). | |||
== مصادر == | == مصادر == | ||
* [http://ruby-doc.org/core-2.5.1/BasicObject.html صغحة الصنف BasicObject في توثيق روبي الرسمي.] | * [http://ruby-doc.org/core-2.5.1/BasicObject.html صغحة الصنف BasicObject في توثيق روبي الرسمي.] |
المراجعة الحالية بتاريخ 07:38، 4 أكتوبر 2018
الصنف BasicObject
هو الصنف الأب لجميع الأصناف في روبي، وهو صنف فارغ.
يمكن استخدام الصنف BasicObject
لإنشاء هرميات كائنية (object hierarchies) مستقلة عن الهرمية الكائنية للغة روبي، أو لإنشاء مغلفات الكائنات (proxy objects) مثل الصنف Delegator
، أو حيث يجب تجنب إفساد مجال الأسماء (namespace pollution) من قبل توابع وأصناف روبي.
لتجنب إفساد الصنف BasicObject
للمستخدمين الآخرين، يجب إنشاء صنف فرعي من الصنف BasicObject
تحت اسم مناسب بدلاً من تعديل BasicObject
مباشرةً:
class MyObjectSystem < BasicObject
end
لا يتضمَّن الصنف BasicObject
الوحدة Kernel
(التي تضم توابعًا مثل puts
)، كما أنَّ الصنف BasicObject
موجود خارج مجال الأسماء الخاص بالمكتبة القياسية (standard library)، لذا لن يُعثَر على الأصناف الشائعة دون استخدام مسار الصنف بأكمله.
يمكن استخدام عدة استراتيجيات لجعل أجزاء من المكتبة القياسية متاحةً في الأصناف المتفرِّعة من الصنف BasicObject
. يستطيع صنف فرعي أن يُضمِّن الصنف Kernel
لأجل الحصول توابع مثل puts
و exit
وغيرهما. يمكن إنشاء وتضمين وحدة (module) مُخصصة مشابهة للوحدة Kernel
، أو يمكن استخدام التفويض (delegation) عبر method_missing
:
class MyObjectSystem < BasicObject
DELEGATE = [:puts, :p]
def method_missing(name, *args, &block)
super unless DELEGATE.include? name
::Kernel.send(name, *args, &block)
end
def respond_to_missing?(name, include_private = false)
DELEGATE.include?(name) or super
end
end
يمكن للأصناف الفرعية للصنف BasicObject
الوصول إلى أصناف ووحدات من المكتبة القياسية للغة روبي وذلك عبر الإشارة إلى الثابت المطلوب من الجذر مباشرةً، مثل ::File
أو ::Enumerator
.
يمكن استخدام const_missing
لتفويض (delegate) البحث عن الثوابت إلى الكائن Object
مثل method_missing
تمامًا:
class MyObjectSystem < BasicObject
def self.const_missing(name)
::Object.const_get(name)
end
end
توابع الصنف العامة (Public Class Methods)
()new
توابع الكائن العامة (Public Instance Methods)
المعامل !=
يتحقق المعامل !=
من عدم تساوي كائنين.
المعامل !
يعكس المعامل !
القيمة المنطقية التي تستعمل معه.
المعامل ==
يتحقق المعامل ==
من تساوي كائنين.
__id__
يعيد التابع __id__
(يدعى أيضًا object_id
) مُعرِّفا عدديًا للكائن الذي استُدعي معه.
__send__
يستدعي التابع __send__
(يدعى أيضًا send
) التابع الممرَّر إليه مع تمرير وسائط محددة إليه.
equal?
يتحقق التابع equal?
إذا كان الكائن الذي استُدعي معه والكائن الذي مُرّر إليه هما نفس الكائن أو يشيران إلى نفس مفتاح الخريطة (hash key).
instance_eval
يقدِّر (Evaluates) التابع instance_eval
ناتج تنفيذ شيفرة مصدرية للغة روبي معطاة كسلسلة نصية أو ناتج كتلة برمجية (block) مُمرَّرة ضمن سياق كائن مُستقبِل (obj).
instance_exec
ينفِّذ التابع instance_exec
الكتلة البرمجية المُمرَّرة ضمن سياق الكائن المستقبل (obj). لتعيين السياق، يُضبَط المتغير self
إلى obj
أثناء تنفيذ الشيفرة، مما يعطي الشيفرة إمكانية الوصول لمتغيرات النسخة obj
.
توابع الكائن الخاصة (Private Instance Methods)
method_missing
يُستدعى هذا التابع من قِبل روبي عندما تُرسَل رسالةٌ إلى كائن لا يستطيع التعامل معها. بشكل افتراضي، يُطلق المفسِّر (interpreter) خطأً عندما يُستدعى هذا التابع.
singleton_method_added
يُستَدعى هذا التابع كرد نداءٍ (callback) في كلِّ مرة يُضاف فيها تابع منفرد (singleton method) جديد إلى المُستقبِل (receiver).
singleton_method_removed
يُستَدعى هذا التابع كرد نداءٍ (callback) في كل مرة يُحذف فيها تابع منفرد (singleton method) من المُستقبِل (receiver).
singleton_method_undefined
يُستدعى هذا التابع كرد نداءٍ (callback) في كل مرة يكون فيها تابع منفرد (singleton method) غير مُعرَّف (undefined) في المُستقبِل (receiver).