التابع Enumerator.new في روبي

من موسوعة حسوب

ينشئ التابع new كائنًا جديدًا من النوع Enumerator يمكن استعماله ككائن قابل للتعداد (Enumerable).

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

new(size = nil) { |yielder| ... }
new(obj, method = :each, *args)

في الشكل الأول للتابع، يُعرَّف التكرار عبر الكتلة المعطاة التي يمكن استخدام الكائن yielder - المعطى كمعامل - فيها لإعادة القيمة الناتجة عبر استدعاء التابع yield (أو اسمه البديل +>>+).

في الشكل الثاني - المهمل - للتابع، يتكرر مُعدِّدٌ مُولَّد عبر الكائن obj المعطى باستعمال التابع method المعطى مع تمرير الوسائط args إليه. لا يُشجَّع على استعمال هذا الشكل من التابع؛ لذا، استعمل التابع Kernel.enum_for أو التابع Kernel.to_enum عوضًا عنه.

المعاملات

size

يمكن استخدام المعامل size الاختياري لتحديد كيفية حساب الحجم في النمط الكسول (lazy fashion، اطلع في هذا السياق على توثيق التابع size). يمكن أن يكون إمَّا قيمةً أو كائنًا قابلًا للاستدعاء (callable object).

obj

الكائن الذي سيتكرر مُعدِّدٌ مُولَّد عبره باستعمال التابع method.

method

التابع الذي سيتكرر عبر الكائن obj. القيمة الافتراضية له هي: each:.

args

المعاملات المراد تمريرها إلى التابع method.

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

يعاد كائن جديد من النوع Enumerator.

أمثلة

مثال على استعمال التابع new في شكله الأول:

fib = Enumerator.new do |y|
  a = b = 1
  loop do
    y << a
    a, b = b, a + b
  end
end

p fib.take(10) # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

مثال على استعمال التابع new في شكله الثاني:

e = Enumerator.new(ObjectSpace, :each_object)
    #-> ObjectSpace.enum_for(:each_object)

e.select { |obj| obj.is_a?(Class) }  #=> array of all classes

انظر أيضًا

  • التابع each: يتكرر عبر الكتلة المعطاة وفقًا للكائن المُعدِّد الذي استدعي معه والطريقة التي أُنشِئ بها.
  • التابع next: يعيد الكائن التالي في المُعدِّد الذي استدعي معه، ويحرك موضع المؤشر الداخلي للأمام خطوة واحدة.

مصادر