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

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: الصنف <code>Class</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Method تصنيف: Ruby Class'
 
طلا ملخص تعديل
 
(3 مراجعات متوسطة بواسطة مستخدم واحد آخر غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: الصنف <code>Class</code> في روبي}}</noinclude>
<noinclude>{{DISPLAYTITLE: الصنف <code>Class</code> في روبي}}</noinclude>
[[تصنيف: Ruby]]
[[تصنيف: Ruby]]
[[تصنيف: Ruby Method]]
[[تصنيف: Ruby Class]]
[[تصنيف: Ruby Class]]
تُعدُّ الأصناف كائناتٍ من الدرجة الأولى (first-class objects) في روبي، وتعدُّ جميعها نُسخٌ من الصنف <code>Class</code>.
عادةً، يمكن عادةً إنشاء صنف جديد بالشكل التالي:<syntaxhighlight lang="ruby">
class Name
# تكتب هنا الشيفرة التي تعرف سلوك الصنف
end
</syntaxhighlight>عندما يُنشَأ صنف جديد، يهيَّأ كائن من النوع <code>Class</code> ويسند إلى ثابت عام (global constant، هو <code>Name</code> في المثال السابق).
عند استدعاء <code>Name.new</code> لإنشاء كائن جديد، يُنفَّذ التابع <code>new</code> الخاص بالصنف <code>Class</code> بشكل افتراضي. يمكن إثبات ذلك من خلال إعادة تعريف التابع <code>new</code>:<syntaxhighlight lang="ruby">
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
</syntaxhighlight>ناتج تنفيذ الشيفرة السابقة هو:<syntaxhighlight lang="ruby">
Creating a new Name
</syntaxhighlight>تكون الأصناف والوحدات (modules) والكائنات مترابطةً مع بعضها بعضًا. في الرسم التوضيحي التالي، تمثل الأسهم الرأسية الوراثة (inheritance)، أما الأقواس فتمثل الأصناف <code>metaclass</code>. وجميع الأصناف <code>metaclass</code> هي نُسخ (instances) من الصنف <code>Class</code>.<syntaxhighlight lang="ruby">
                        +---------+            +-...
                        |        |            |
        BasicObject-----|-->(BasicObject)-------|-...
            ^          |        ^            |
            |          |        |            |
          Object---------|----->(Object)---------|-...
            ^          |        ^            |
            |          |        |            |
            +-------+  |        +--------+    |
            |      |  |        |        |    |
            |    Module-|---------|--->(Module)-|-...
            |      ^  |        |        ^    |
            |      |  |        |        |    |
            |    Class-|---------|---->(Class)-|-...
            |      ^  |        |        ^    |
            |      +---+        |        +----+
            |                    |
obj--->OtherClass---------->(OtherClass)-----------...
</syntaxhighlight>
== توابع الصنف العامة (Public Class Methods) ==
===[[Ruby/Class/_new |<code>new</code>]]===
يُنشئ التابع <code>new</code> صنفًا جديدًا مجهولًا غير مسمى (unnamed) من الصنف الأب (superclass) الممرر إليه (أو من الصنف <code>Object</code> إن لم يمرر إليه أي شيء).
== توابع الكائن الخاصة (Public Instance Methods) ==
===[[Ruby/Class/allocate |<code>allocate</code>]]===
يحجز التابع <code>allocate</code> مساحةً من الذاكرة لكائن جديد من الصنف <code>class</code> دون استدعاء التابع <code>initialize</code> مع النسخة (instance) الجديدة. يجب أن يكون الكائن المُعاد نسخةً من الصنف <code>class</code>.
===[[Ruby/Class/inherited |<code>inherited</code>]]===
يُستدعَى التابع <code>inherited</code> كرد نداء في كل مرة يُنشأ فيها صنف فرعي (subclass) من الصنف الحالي.
===[[Ruby/Class/new |<code>new</code>]]===
يستدعي التابع <code>new</code> التابعَ<nowiki/>[[Ruby/Class/allocate | <code>allocate</code>]] لإنشاء كائن جديد من الصنف <code>class</code>، ثم يستدعي التابع <code>initialize</code> مع ذلك الكائن المنشأ ويُمرِّر إليه وسائط محددة.
===[[Ruby/Class/superclass |<code>superclass</code>]]===
يعيد التابع <code>superclass</code> الصنف الأب (superclass) للصنف المستدعى معه.
== مصادر ==
* [http://ruby-doc.org/core-2.5.1/Class.html صفحة الصنف Class في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 08:53، 4 أكتوبر 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) للصنف المستدعى معه.

مصادر