التابع 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
: يعيد الكائن التالي في المُعدِّد الذي استدعي معه، ويحرك موضع المؤشر الداخلي للأمام خطوة واحدة.