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

من موسوعة حسوب
< Ruby‏ | Object
أنشأ الصفحة ب'{{DISPLAYTITLE:التابع Object.dup في روبي}} ينتج التابع <code>dup</code> نسخةً سطحية (shallow copy) من الكائن. تُنسَخ مت...'
 
طلا ملخص تعديل
 
سطر 1: سطر 1:
{{DISPLAYTITLE:التابع Object.dup في روبي}}
{{DISPLAYTITLE:التابع <code>Object.dup</code> في روبي}}
 
ينتج التابع <code>dup</code> نسخةً سطحية (shallow copy) من الكائن. تُنسَخ متغيرات النسخة (instance variables) من الكائن، ولكن لا تُنسَخ الكائنات التي تشير إليها (referenced objects). يَنسخ التابع <code>dup</code> الحالة التالفة (tainted state) من الكائن.
ينتج التابع <code>dup</code> نسخةً سطحية (shallow copy) من الكائن. تُنسَخ متغيرات النسخة (instance variables) من الكائن، ولكن لا تُنسَخ الكائنات التي تشير إليها (referenced objects). يَنسخ التابع <code>dup</code> الحالة التالفة (tainted state) من الكائن.


قد يملك هذا التابع سلوكًا محدَّدًا بالصنف (class-specific behavior)، إذا كان كذلك، سيُوثَّق هذا السلوك تحت التابع ‎.<code>initialize_copy</code> من الصنف نفسه.
قد يملك هذا التابع سلوكًا محدَّدًا بالصنف (class-specific behavior)، إذا كان كذلك، سيُوثَّق هذا السلوك تحت التابع ‎.<code>initialize_copy</code> من الصنف نفسه.


ما هو الفرق بين التابع <code>clone</code> والتابع <code>dup</code>؟
ما هو الفرق بين التابع <code>[[Ruby/Object/clone|clone]]</code> والتابع <code>dup</code>؟


عمومًا، قد يمتلك التابعين <code>clone</code> و <code>dup</code> دلالاتٍ مختلفةٍ في الأصناف السليلة (descendant classes). لمَّا كان التابع <code>clone</code> يُستخدم في إنشاء نسخةٍ مضاعفةٍ من التابع بما فيها حالته الداخلية (internal state)، فإنَّ التابع <code>dup</code> يَستخدم صنف الكائن السليل لإنشاء نسخةٍ (instance) جديدة.
عمومًا، قد يمتلك التابعين <code>clone</code> و <code>dup</code> دلالاتٍ مختلفةٍ في الأصناف السليلة (descendant classes). لمَّا كان التابع <code>clone</code> يُستخدم في إنشاء نسخةٍ مضاعفةٍ من التابع بما فيها حالته الداخلية (internal state)، فإنَّ التابع <code>dup</code> يَستخدم صنف الكائن السليل لإنشاء نسخةٍ (instance) جديدة.
سطر 12: سطر 11:


== البنية العامة ==
== البنية العامة ==
<syntaxhighlight lang="ruby">
dup → an_object
dup → an_object
</syntaxhighlight>


== القيم المعادة ==
== القيم المعادة ==
سطر 18: سطر 19:


== أمثلة ==
== أمثلة ==
مثالٌ عن استخدام التابع dup:
مثالٌ عن استخدام التابع <code>dup</code>:<syntaxhighlight lang="ruby">
class Klass
  attr_accessor :str
end
 
module Foo
  def foo; 'foo'; end
end
 
s1 = Klass.new #=> #<Klass:0x401b3a38>
s1.extend(Foo) #=> #<Klass:0x401b3a38>
s1.foo #=> "foo"
 
s2 = s1.clone #=> #<Klass:0x401b3a38>
s2.foo #=> "foo"
 
s3 = s1.dup #=> #<Klass:0x401b3a38>
s3.foo #=> NoMethodError: undefined method `foo' for #<Klass:0x401b3a38>
 
</syntaxhighlight>


== انظر أيضًا ==
== انظر أيضًا ==
* التابع class: يعيد صنف الكائن المعطى.
* التابع <code>[[Ruby/Object/class|class]]</code>: يعيد صنف الكائن المعطى.
* التابع clone: يُنتج نسخةً سطحيةً من الكائن المعطى.
* التابع <code>[[Ruby/Object/clone|clone]]</code>: يُنتج نسخةً سطحيةً من الكائن المعطى.
* التابع tap: يُدخل الكائن المعطى إلى الكتلة ثم يعيده.
* التابع yield_self: يُدخل الكائن المعطى إلى الكتلة ويُعيد ناتج تنفيذ هذه الكتلة.


*التابع <code>[[Ruby/Object/tap|tap]]</code>: يُدخل الكائن المعطى إلى الكتلة ثم يعيده.
*التابع <code>[[Ruby/Object/yield self|yield_self]]</code>: يُدخل الكائن المعطى إلى الكتلة ويُعيد ناتج تنفيذ هذه الكتلة.
== مصادر ==
== مصادر ==
* [http://ruby-doc.org/core-2.5.1/Object.html#method-i-dup صفحة التابع dup في الصنف Object في توثيق روبي الرسمي.]
* [http://ruby-doc.org/core-2.5.1/Object.html#method-i-dup صفحة التابع dup في الصنف Object في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 15:53، 22 نوفمبر 2018

ينتج التابع dup نسخةً سطحية (shallow copy) من الكائن. تُنسَخ متغيرات النسخة (instance variables) من الكائن، ولكن لا تُنسَخ الكائنات التي تشير إليها (referenced objects). يَنسخ التابع dup الحالة التالفة (tainted state) من الكائن.

قد يملك هذا التابع سلوكًا محدَّدًا بالصنف (class-specific behavior)، إذا كان كذلك، سيُوثَّق هذا السلوك تحت التابع ‎.initialize_copy من الصنف نفسه.

ما هو الفرق بين التابع clone والتابع dup؟

عمومًا، قد يمتلك التابعين clone و dup دلالاتٍ مختلفةٍ في الأصناف السليلة (descendant classes). لمَّا كان التابع clone يُستخدم في إنشاء نسخةٍ مضاعفةٍ من التابع بما فيها حالته الداخلية (internal state)، فإنَّ التابع dup يَستخدم صنف الكائن السليل لإنشاء نسخةٍ (instance) جديدة.

عند استخدام التابع dup، لن تُنسخ أي وحداتٍ (modules) أضيفت إلى التابع لتوسيع عمله.

البنية العامة

dup  an_object

القيم المعادة

تُعاد نسخةٌ منفردةٌ من الكائن بنفس متغيرات النسخة ولكن من دون الكائنات التي تشير تلك المتغيرات إليها.

أمثلة

مثالٌ عن استخدام التابع dup:

class Klass
  attr_accessor :str
end

module Foo
  def foo; 'foo'; end
end

s1 = Klass.new #=> #<Klass:0x401b3a38>
s1.extend(Foo) #=> #<Klass:0x401b3a38>
s1.foo #=> "foo"

s2 = s1.clone #=> #<Klass:0x401b3a38>
s2.foo #=> "foo"

s3 = s1.dup #=> #<Klass:0x401b3a38>
s3.foo #=> NoMethodError: undefined method `foo' for #<Klass:0x401b3a38>

انظر أيضًا

  • التابع class: يعيد صنف الكائن المعطى.
  • التابع clone: يُنتج نسخةً سطحيةً من الكائن المعطى.
  • التابع tap: يُدخل الكائن المعطى إلى الكتلة ثم يعيده.
  • التابع yield_self: يُدخل الكائن المعطى إلى الكتلة ويُعيد ناتج تنفيذ هذه الكتلة.

مصادر