صفحة الصنف BasicObject
في روبي
الصنف 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 Instance Methods)
المعامل != في الصنف BasicObject
يتحقق المعامل != من عدم تساوي كائنين.
المعامل ! في الصنف BasicObject
يعكس المعامل ! القيمة المنطقية التي تستعمل معه.
التابع equal? في الصنف BasicObject
يتحقق التابع equal?
? إذا كان الكائن الذي استُدعي معه والكائن الذي مُرّر إليه هما نفس الكائن أو يشيران إلى نفس مفتاح الخريطة (hash
key
).
عمومًا، يُعاد تعريف هذا التابع في الأصناف السليلة (descendant
classes
) لتتناسب مع تلك الأصناف. خلافًا للمعامل ==، يجب ألا يُعاد تعريف التابع equal?
? من قِبل الأصناف الفرعية، إذ يُستخدم آنذاك لتحديد هوية الكائن (أي يستعمل بالشكل a
. equal?
?(b
) لتحديد إذا وفقط إذا كان الكائن a
هو نفسه الكائن b
[انظر المثال في الأسفل]).
يُستخدم هذا التابع من قِبل كائنات الصنف Hash
للتحقق من تساوي العناصر. بالنسبة لكائنات الصنف Object
، يكون استعمال التابع eql?
? مماثلًا لاستعمال المعامل ==.
تستمر الأصناف الفرعية بتطبيق هذا الأمر وذلك بجعل التابع eql?
? اسمًا بديلًا للمعامل == المُعاد تعريفه (overridden
) في تلك الأصناف، ولكن هنالك استثناءات دومًا. يُجرَى للأنواع العددية (Numeric
types
) مثلًا عمليات تحويل عند موازنتها باستعمال المعامل == فقط، وليس باستعمال التابع ??eql
. إليك المثال التالي الذي يوضح ذلك:
1 == 1.0 #=> true
1.eql?
? 1.0 #=> false
المعامل == في الصنف BasicObject
يتحقق المعامل == من تساوي كائنين.
عمومًا، يُعاد تعريف هذا التابع في الأصناف السليلة (descendant
classes
) بما يتناسب مع تلك الأصناف. خلافًا للمعامل ==، يجب ألا يُعاد تعريف التابع equal?
? من قِبل الأصناف الفرعية، إذ يُستخدم آنذاك لتحديد هوية الكائن (أي يستعمل بالشكل a
. equal?
?(b
) لتحديد إذا وفقط إذا كان الكائن a
هو نفسه الكائن b
[انظر المثال في الأسفل]).
يعمل التابع eql?
? على التحقق إذا كان الكائن الذي استُدعي معه والكائن الذي مُرّر إليه هما نفس الكائن أو يشيران إلى نفس مفتاح الخريطة (hash
key
). ويُستخدم هذا التابع من قِبل كائنات الصنف Hash
للتحقق من تساوي العناصر. بالنسبة لكائنات الصنف Object
، يكون استعمال التابع eql?
? مماثلًا لاستعمال المعامل ==.
تستمر الأصناف الفرعية بتطبيق هذا الأمر وذلك بجعل التابع eql?
? اسمًا بديلًا للمعامل == المُعاد تعريفه (overridden
) في تلك الأصناف، ولكن هنالك استثناءات دومًا. يُجرَى للأنواع العددية (Numeric
types
) مثلًا عمليات تحويل عند موازنتها باستعمال المعامل == فقط، وليس باستعمال التابع ??eql
. إليك المثال التالي الذي يوضح ذلك:
1 == 1.0 #=> true
1.eql?
? 1.0 #=> false
التابع __id__ في الصنف BasicObject
يعيد التابع __id__
(يدعى أيضًا object_id
) مُعرِّفا عدديًا للكائن الذي استُدعي معه. سيُعاد نفس المعرِّف في كل مرة يُستدعى فيها التابع object_id
مع الكائن نفسه، ولن يتشارك أي كائنين نشطين نفس المعرِّف.
ملاحظة: يعاد استخدام بعض كائنات الأصناف المٌضمّنة (builtin
classes
) وذلك لتحسين الأداء. هذا هو الحال بالنسبة للقيم المباشرة (immediate
values
) والسلاسل النصية الحرفية المجمدة (frozen
string
literals
).
لا تُمرَّر القيم المباشرة بالمرجع (reference
) ولكنَّها تُمرَّر بالقيمة، مثل nil
، و true
، و false
، و Fixnums
، و Symbols
، و Floats
.
التابع instance_eval في الصنف BasicObject
يقدِّر (Evaluates
) التابع instance_eval
ناتج تنفيذ شيفرة مصدرية للغة روبي معطاة كسلسلة نصية أو ناتج كتلة برمجية (bolck
) مُمرَّرة ضمن سياق كائن مُستقبِل (obj
). لتعيين السياق، يُضبَط المتغير self
إلى obj
أثناء تنفيذ الشيفرة، مما يعطي الشيفرة إمكانية الوصول لمتغيرات النسخة obj
والتوابع الخاصة.
عندما يُمرَّر إلى التابع instance_eval
كتلة برمجية، يُمرَّر obj
أيضاً كوسيط وحيد للكتلة.
التابع instance_exec في الصنف BasicObject
ينفِّذ التابع instance_exec
الكتلة البرمجية المُمرَّرة ضمن سياق الكائن المستقبل (obj
). لتعيين السياق، يُضبَط المتغير self
إلى obj
أثناء تنفيذ الشيفرة، مما يعطي الشيفرة إمكانية الوصول لمتغيرات النسخة obj
.
التابع method_missing في الصنف BasicObject
يُستدعى هذا التابع من قِبل روبي عندما تُرسَل رسالةٌ إلى كائن لا يستطيع التعامل معها. بشكل افتراضي، يُطلق المفسِّر (interpreter
) خطأً عندما يُستدعى هذا التابع. على أي حال، يمكن إعادة تعريف (override
) هذا التابع للحصول على سلوك أكثر ديناميكية. إذا تقرر أنه لا يجب التعامل مع تابع معيّن، فيجب حينئذٍ استدعاء super
حتى يتسنَّى للأصناف الأجداد (ancestors
) الوصول إلى التابع المنشود.
التابع __send__ في الصنف BasicObject في ruby
يستدعي التابع __send__
(يدعى أيضًا send
) التابع الممرَّر إليه مع تمرير وسائط محددة إليه.
يُستعمَل الاسم __send__
الخاص بهذا التابع إذا تعارض الاسم send
مع اسم تابع موجود مسبقًا في obj
.
التابع singleton_method_added في الصنف BasicObject
يُستَدعى هذا التابع كرد نداءٍ (callback
) في كلِّ مرة يُضاف فيها تابع منفرد (singleton
method
) جديد إلى المُستقبِل (receiver
).
التابع singleton_method_removed في الصنف BasicObject
يُستَدعى هذا التابع كرد نداءٍ (callback
) في كل مرة يُحذف فيها تابع منفرد (singleton
method
) من المُستقبِل (receiver
).
التابع singleton_method_undefined في الصنف BasicObject
يُستدعى هذا التابع كرد نداءٍ (callback
) في كل مرة يكون فيها تابع منفرد (singleton
method
) غير مُعرَّف (undefined
) في المُستقبِل (receiver
).