التابع Object.dup في روبي

من موسوعة حسوب
< Ruby‏ | 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: يُدخل الكائن المعطى إلى الكتلة ويُعيد ناتج تنفيذ هذه الكتلة.

مصادر