الفرق بين المراجعتين ل"Ruby/Class"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
سطر 5: سطر 5:
 
تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف <code>Class</code>.
 
تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف <code>Class</code>.
  
 +
== عموميات ==
 
يمكن عادةً إنشاء صنف جديد بالشكل التالي:<syntaxhighlight lang="ruby">
 
يمكن عادةً إنشاء صنف جديد بالشكل التالي:<syntaxhighlight lang="ruby">
 
class Name
 
class Name
سطر 15: سطر 16:
 
</syntaxhighlight>عندما يُنشَأ صنف جديد، يهيَّأ كائن من النوع Class ويسند إلى ثابت عام (global constant) (هو Name في المثال السابق).
 
</syntaxhighlight>عندما يُنشَأ صنف جديد، يهيَّأ كائن من النوع Class ويسند إلى ثابت عام (global constant) (هو Name في المثال السابق).
  
عند استدعاء Name.new لإنشاء كائن جديد، يُنفَّذ التابع new الخاص بالصنف Class بشكل افتراضي. يمكن إثبات ذلك من خلال إعادة تعريف التابع new في الصنف Class:<syntaxhighlight lang="ruby">
+
عند استدعاء Name.new لإنشاء كائن جديد، يُنفَّذ التابع new الخاص بالصنف Class بشكل افتراضي. يمكن إثبات ذلك من خلال إعادة تعريف التابع new :<syntaxhighlight lang="ruby">
 
class Class
 
class Class
 
   alias old_new new
 
   alias old_new new
سطر 56: سطر 57:
  
 
== توابع الصنف العامة (Public Class Methods) ==
 
== توابع الصنف العامة (Public Class Methods) ==
 +
===[[Ruby/Class/_new |التابع <code>new</code>]]===
 +
يُنشئ التابع  <code>new</code> صنفًا جديدًا مجهولًا غير مسمى (unnamed) من الصنف الأب ( <code>superclass</code>) الممرر إليه (أو من الصنف <code>Object</code> إن لم يمرر إليه أي شيء).
  
 
== توابع الكائن الخاصة (Public Instance Methods) ==
 
== توابع الكائن الخاصة (Public Instance Methods) ==
===[[Ruby/Class/allocate | التابع <code>allocate</code> في الصنف <code>Class</code> ]]===
+
===[[Ruby/Class/allocate | التابع <code>allocate</code>]]===
يحجز التابع <code>allocate</code> مساحةً من الذاكرة لكائن جديد من الصنف <code>class</code> دون استدعاء التابع <code>initialize</code> مع النسخة (<code>instance</code>) الجديدة. يجب أن يكون الكائن المُعاد نسخةً من الصنف <code>class</code>.
+
يحجز التابع <code>allocate</code> مساحةً من الذاكرة لكائن جديد من الصنف <code>class</code> دون استدعاء التابع <code>initialize</code> مع النسخة (instance) الجديدة. يجب أن يكون الكائن المُعاد نسخةً من الصنف <code>class</code>.
===[[Ruby/Class/inherited | التابع <code>inherited</code> في الصنف <code>Class</code> ]]===
+
===[[Ruby/Class/inherited | التابع <code>inherited</code>]]===
يُستدعَى التابع <code>inherited</code> كرد نداء في كل مرة يُنشأ فيها صنف فرعي (<code>subclass</code>) من الصنف الحالي.
+
يُستدعَى التابع <code>inherited</code> كرد نداء في كل مرة يُنشأ فيها صنف فرعي (subclass) من الصنف الحالي.
===[[Ruby/Class/new | التابع <code>new</code> في الصنف <code>Class</code> ]]===
+
===[[Ruby/Class/new | التابع <code>new</code>]]===
 
يستدعي التابع <code>new</code> التابعَ [[Ruby/Class/allocate | <code>allocate</code>]] لإنشاء كائن جديد من الصنف <code>class</code>، ثم يستدعي التابع <code>initialize</code> مع ذلك الكائن المنشأ ويُمرِّر إليه وسائط محددة.
 
يستدعي التابع <code>new</code> التابعَ [[Ruby/Class/allocate | <code>allocate</code>]] لإنشاء كائن جديد من الصنف <code>class</code>، ثم يستدعي التابع <code>initialize</code> مع ذلك الكائن المنشأ ويُمرِّر إليه وسائط محددة.
هذا هو التابع الذي يُستدعى كلما أريد إنشاء كائن باستخدام التابع ‎.<code>new</code>.[<code>a</code>]
+
===[[Ruby/Class/superclass | التابع <code>superclass</code>]]===
===[[Ruby/Class/superclass | التابع <code>superclass</code> في الصنف <code>Class</code> ]]===
+
يعيد التابع <code>superclass</code> الصنف الأب (superclass) للصنف المستدعى معه.
يعيد التابع <code>superclass</code> الصنف الأب (<code>superclass</code>) للصنف المستدعى معه.
 
===[[Ruby/Class/_new | التابع <code>new</code> في الصنف <code>Class</code> ]]===
 
يُنشئ التابع [[Ruby/Class/new | <code>new</code>]] صنفًا جديدًا مجهولًا غير مسمى (<code>unnamed</code>) من الصنف الأب ([[Ruby/Class/superclass | <code>superclass</code>]]) الممرر إليه (أو من الصنف <code>Object</code> إن لم يمرر إليه أي شيء). يمكن إعطاء صنف ما اسمًا عن طريق تعيين كائن الصنف[<code>a</code>][<code>b</code>] (<code>class</code> <code>object</code>) وإعطائه قيمة ثابتة.
 
إن أعطيت كتلة برمجية، فسيُمرَّر إليها كائن الصنف (<code>class</code> <code>object</code>)، وستقدَّر الكتلة في سياق ذلك الصنف كما هو الحال مع <code>class_eval</code>.
 
عيِّن الصنف وأعطه قيمة ثابتة (يبدأ الاسم بأحرف كبيرة) إذا كنت تريد معاملته كصنف اعتيادي.
 
 
 
 
== مصادر ==
 
== مصادر ==
 
* [http://ruby-doc.org/core-2.5.1/Class.html صفحة الصنف Class في توثيق روبي الرسمي.]
 
* [http://ruby-doc.org/core-2.5.1/Class.html صفحة الصنف Class في توثيق روبي الرسمي.]

مراجعة 14:35، 12 سبتمبر 2018

تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف Class.

عموميات

يمكن عادةً إنشاء صنف جديد بالشكل التالي:

class Name

# تكتب هنا الشيفرة التي تعرف سلوك الصنف

end

عندما يُنشَأ صنف جديد، يهيَّأ كائن من النوع Class ويسند إلى ثابت عام (global constant) (هو Name في المثال السابق). عند استدعاء Name.new لإنشاء كائن جديد، يُنفَّذ التابع new الخاص بالصنف Class بشكل افتراضي. يمكن إثبات ذلك من خلال إعادة تعريف التابع new :

class Class
  alias old_new new
  def new(*args)
    print "Creating a new ", self.name, "\n"
    old_new(*args)
  end
end

class Name
end

n = Name.new

ناتج تنفيذ الشيفرة السابقة هو:

Creating a new Name

تكون الأصناف والوحدات (modules) والكائنات مترابطةً مع بعضها بعضًا. في الرسم التوضيحي التالي، تمثل الأسهم الرأسية الوراثة (inheritance)، أما الأقواس فتمثل الأصناف metaclass. وجميع الأصناف metaclass هي نُسخ (instances) من الصنف Class.

                        +---------+             +-...
                         |         |             |
         BasicObject-----|-->(BasicObject)-------|-...
             ^           |         ^             |
             |           |         |             |
          Object---------|----->(Object)---------|-...
             ^           |         ^             |
             |           |         |             |
             +-------+   |         +--------+    |
             |       |   |         |        |    |
             |    Module-|---------|--->(Module)-|-...
             |       ^   |         |        ^    |
             |       |   |         |        |    |
             |     Class-|---------|---->(Class)-|-...
             |       ^   |         |        ^    |
             |       +---+         |        +----+
             |                     |
obj--->OtherClass---------->(OtherClass)-----------...

توابع الصنف العامة (Public Class Methods)

التابع new

يُنشئ التابع new صنفًا جديدًا مجهولًا غير مسمى (unnamed) من الصنف الأب ( superclass) الممرر إليه (أو من الصنف Object إن لم يمرر إليه أي شيء).

توابع الكائن الخاصة (Public Instance Methods)

التابع allocate

يحجز التابع allocate مساحةً من الذاكرة لكائن جديد من الصنف class دون استدعاء التابع initialize مع النسخة (instance) الجديدة. يجب أن يكون الكائن المُعاد نسخةً من الصنف class.

التابع inherited

يُستدعَى التابع inherited كرد نداء في كل مرة يُنشأ فيها صنف فرعي (subclass) من الصنف الحالي.

التابع new

يستدعي التابع new التابعَ allocate لإنشاء كائن جديد من الصنف class، ثم يستدعي التابع initialize مع ذلك الكائن المنشأ ويُمرِّر إليه وسائط محددة.

التابع superclass

يعيد التابع superclass الصنف الأب (superclass) للصنف المستدعى معه.

مصادر