当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Object.to_enum用法及代码示例


本文简要介绍ruby语言中 Object.to_enum 的用法。

用法

to_enum(method = :each, *args) → enum
to_enum(method = :each, *args) {|*args| block} → enum
也别名为:enum_for

创建一个新的 Enumerator ,它将通过在 obj 上调用 method 来枚举,如果有的话,传递 argsyielded 通过方法变成了枚举数的值。

如果给出了一个块,它将用于计算枚举器的大小,而无需对其进行迭代(参见 Enumerator#size )。

例子

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)

# String#split in block form is more memory-effective:
very_large_string.split("|") { |chunk| return chunk if chunk.include?('DATE') }
# This could be rewritten more idiomatically with to_enum:
very_large_string.to_enum(:split, "|").lazy.grep(/DATE/).first

在为泛型 Enumerable 定义方法时,通常会调用 to_enum ,以防不传递任何块。

这是一个这样的示例,带有参数传递和大小调整块:

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

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Object.to_enum。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。