为什么Enumerator.new需要一个"yielder"对象?

Jon*_*nah 5 ruby yield enumerator

考虑一个像这样的简单枚举器:

natural_numbers = Enumerator.new do |yielder|
  number = 1
  loop do
    yielder.yield number
    number += 1
  end
end
Run Code Online (Sandbox Code Playgroud)

我的问题是:为什么ruby要求我们在yielder对象上调用yield?换句话说:为什么我们不能代替yielder.yield numberyield number?在这个例子中,如果允许的话,它看起来是一样的.有没有以非平凡的方式使用yielder的例子?如果是这样,你能给一个吗?如果没有,yielder的目的是什么?

谢谢.

Mla*_*vić 3

不能 100% 确定这是否是原因,但yield单独(总是)适用于提交给调用方法的块yield:在您的情况下,包含赋值的方法natural_numbers;它不可能执行所需的操作Enumerator,即发出 Enumerator 元素。尽管名称相同,但Yielder#yield它是一个方法,而 Ruby 的yield是一个声明。

换句话说,不可能实现可以Enumerator与语句一起使用的构造函数yield