التابع Object.dup
في روبي
ينتج التابع 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>
انظر أيضًا
- التابع
tap
: يُدخل الكائن المعطى إلى الكتلة ثم يعيده. - التابع
yield_self
: يُدخل الكائن المعطى إلى الكتلة ويُعيد ناتج تنفيذ هذه الكتلة.