الفرق بين المراجعتين لصفحة: «Ruby/BasicObject»

من موسوعة حسوب
لا ملخص تعديل
ط إضافة القسم "توابع الصنف العامة" الناقص.
 
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>BasicObject</code> في روبي
<noinclude>{{DISPLAYTITLE:الصنف <code>BasicObject</code> في روبي
  }}</noinclude>
  }}</noinclude>
[[تصنيف: Ruby]]
[[تصنيف: Ruby]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Class]]
[[تصنيف: Ruby ARGF]]
[[تصنيف: Ruby BasicObject]]
الصنف <code>BasicObject</code>هو الصنف الأب لجميع الأصناف في روبي، وهو صنف فارغ.
الصنف <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) من قبل توابع وأصناف روبي.
سطر 13: سطر 13:
</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>method_missing</code>:<syntaxhighlight lang="ruby">
يمكن استخدام عدة استراتيجيات لجعل أجزاء من المكتبة القياسية متاحةً في الأصناف المتفرِّعة من الصنف <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]


سطر 27: سطر 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)
سطر 35: سطر 33:
</syntaxhighlight>
</syntaxhighlight>


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

مصادر