我无法理解这件事。我试着咨询ruby-doc on enumerator,但没有多大帮助。
来自ruby-doc:
fib = Enumerator.new do |y|
a = b = 1
loop do
y << a
a, b = b, a + b
end
end我不明白的是,为什么我不能只写fib = Enumerator.new,而我必须写fib = Enumerator.new do |y|?
y是什么类型的对象?当fib.next或fib.take(5)被执行时,y在做什么?
发布于 2016-06-18 02:18:22
您正在使用的表单接受一个块作为参数,其中的值y可以是您想要的任何值。
当fib.next被调用时,值y被“让给”调用者。正如您在示例中看到的,该块调用loop并在每次迭代中计算一个值。所以y是一个累加值的数组。
因此,在fib枚举器上调用take(10)会“产生”前十个斐波那契数。调用next将“产生”第11个,依此类推。这个枚举数可以被看作是“无限的”,即使它们不需要这样。
另一个人为设计的例子:
concat = Enumerator.new do |c|
cat = "concat"
loop do
c << cat
cat += "concat"
end
end
p concat.take(5)在这里,枚举器一遍又一遍地生成一个"concat“字符串。This是一篇较旧的文章,但是枚举器是可枚举的,因此您可以使用此类中的方法,也可以通过调用take来查看。
发布于 2016-06-18 02:14:27
我不明白的是,为什么我不能直接写
= Enumerator.new,而必须写fib = Enumerator.new do |y|?
您已经创建了一个枚举器,该枚举器在调用next或take(5)之前不计算任何值
y是引用枚举数的局部作用域变量。实际上,您是在将枚举器提供给块do..end,并在枚举器上应用您自己的逻辑,因此当它被访问时,它的计算结果就是您想要的值。
https://stackoverflow.com/questions/37887612
复制相似问题