التابع Object.to_enum
في روبي
يُنشئ التابع enum_for
نسخةً من الصنف Enumerator
الذي يجري عملية عدٍّ (enumerate) وتكرار عبر استدعاء التابع المُمرَّر إليها مع كائنٍ محدَّد، وتمرير وسائط إن أعطيت.
إذا مُرِّرت كتلة (block) إلى التابع، فستُستخدم لحساب حجم نسخة الصنف Enumerator
دون الحاجة إلى تكرارها (ألقِ نظرة على التابع Enumerator.size
).
البنية العامة
enum_for(method = :each, *args) → enum
enum_for(method = :each, *args){|*args| block} → enum
المعاملات
method
التابع المُمرَّر. القيمة الافتراضية لهذا المعامل هي: each:
.
args*
الوسائط المراد تمريرها إلى التابع.
args| block*|
الكتلة ووسائطها المراد تنفيذها عند استدعاء التابع.
القيم المعادة
تُعاد نسخةٌ من الصنف Enumerator
.
أمثلة
مثالٌ عن استخدام التابع to_enum
:
str = "xyz"
enum = str.enum_for(:each_byte)
enum.each { |b| puts b }
# => 120
# => 121
# => 122
# protect an array from being modified by some_method
a = [1, 2, 3]
some_method(a.to_enum)
يُستدعَى التابع to_enum
عادةً عند تعريف توابع نُسَخ الصنف Enumerable
المعمَّم (generic) في حال لم تُمرَّر أي كتلة.
يوضح المثال التالي كيفية تمرير معامل وكتلة مهمتها حساب الحجم:
module Enumerable
# a generic method to repeat the values of any enumerable
def repeat(n)
raise ArgumentError, "#{n} is negative!" if n < 0
unless block_given?
return to_enum(__method__, n) do # __method__ is :repeat here
sz = size # Call size and multiply by n...
sz * n if sz # but return nil if size itself is nil
end
end
each do |*val|
n.times { yield *val }
end
end
end
%i[hello world].repeat(2) { |w| puts w }
# => Prints 'hello', 'hello', 'world', 'world'
enum = (1..14).repeat(3)
# => returns an Enumerator when called without a block
enum.first(4) # => [1, 1, 1, 2]
enum.size # => 42
انظر أيضًا
- التابع
class
: يعيد صنف الكائن المعطى.
- التابع
clone
: يُنتج نسخةً سطحيةً من الكائن المعطى. - التابع
dup
: ينتج نسخةً سطحية من الكائن. - التابع
tap
: يُدخل الكائن المعطى إلى الكتلة ثم يعيده. - التابع
yield_self
: يُدخل الكائن المعطى إلى الكتلة ويُعيد ناتج تنفيذ هذه الكتلة.