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

من موسوعة حسوب
< Ruby‏ | Object
مراجعة 10:08، 25 نوفمبر 2018 بواسطة محمد-خطيب (نقاش | مساهمات) (أنشأ الصفحة ب'{{DISPLAYTITLE:التابع <code>Object.to_enum</code> في روبي}} يُنشئ التابع <code>enum_for</code> نسخةً من الصنف <code>Ruby/Enumerator|...')
(فرق) → مراجعة أقدم | المراجعة الحالية (فرق) | مراجعة أحدث ← (فرق)

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

مصادر