2011-12-27 22 views
5

考虑一个简单枚举是这样的:为什么Enumerator.new需要一个“yielder”对象?

natural_numbers = Enumerator.new do |yielder| 
    number = 1 
    loop do 
    yielder.yield number 
    number += 1 
    end 
end 

我的问题是:为什么红宝石要求我们的yielder对象调用的收益呢?换句话说:为什么我们不能用yield number代替yielder.yield number?在这个例子中,如果允许的话,它看起来是同样的东西。有没有例子说明yielder是以不平凡的方式使用的?如果是这样,你可以给一个吗?如果不是,Yielder的目的是什么?

谢谢。

回答

3

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

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

相关问题