ruby - Enumerator::Yielder#yield 方法何时有用?

标签 ruby yield enumerable

问题“Meaning of the word yield”提到了Enumerator::Yielder#yield 方法。没用过,不知道什么情况下会有用。

当您想创建一个无限的项目列表(例如埃拉托色尼筛网)以及需要使用外部迭代器时,它是否主要有用?

最佳答案

How to create an infinite enumerable of Times? ” 谈论构造和惰性迭代器,但我最喜欢的用法是用附加功能包装现有的 Enumerable(任何可枚举的,无需知道它到底是什么,是否无限等)。

一个简单的例子是实现 each_with_index 方法(或者更一般地说,with_index 方法):

module Enumerable
  def my_with_index
    Enumerator.new do |yielder|
      i = 0
      self.each do |e|
        yielder.yield e, i
        i += 1
      end
    end
  end

  def my_each_with_index
    self.my_with_index.each do |e, i|
      yield e, i
    end
  end
end

[:foo, :bar, :baz].my_each_with_index do |e,i|
  puts "#{i}: #{e}"
end
#=>0: foo
#=>1: bar
#=>2: baz

扩展到核心库中尚未实现的内容,例如将给定数组的值循环分配给每个可枚举元素(例如,为表格行着色):

module Enumerable
  def with_cycle values
    Enumerator.new do |yielder|
      self.each do |e|
        v = values.shift
        yielder.yield e, v
        values.push v
      end
    end
  end
end

p (1..10).with_cycle([:red, :green, :blue]).to_a # works with any Enumerable, such as Range
#=>[[1, :red], [2, :green], [3, :blue], [4, :red], [5, :green], [6, :blue], [7, :red], [8, :green], [9, :blue], [10, :red]]

重点是这些方法返回一个 Enumerator,然后您可以将其与常用的 Enumerable 方法结合使用,例如 selectmap , 注入(inject)

关于ruby - Enumerator::Yielder#yield 方法何时有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5071802/

相关文章:

php - 人脸检测和图像组合

ruby-on-rails - Ruby on Rails,包括带参数的模块

c# - 屈服并释放内存

python-3.x - 如何使用 python 生成器递归生成对象?

struct - Elixir:如何使结构可枚举

arrays - Enumerable 的 group_by 是否保留 Enumerable 的顺序?

c# - LINQ:获取不在记录中的项目 - C#

ruby-on-rails - ActionView::Template::不支持错误对象

ruby-on-rails - 另一个语句中的每个语句都出现故障?

ruby - 在参数为 `yield self` 的方法中使用 `&block` 和在没有参数 `yield self` 的方法中使用 `&block` 有什么区别吗?