我无法绕过它。我试图咨询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
是什么类型的对象?执行y
或执行fib.next
时fib.take(5)
执行的操作是什么?
答案 0 :(得分:1)
您正在使用的表单接受一个块作为参数,其中值number = request.form.get('number', type=int)
可以是您想要的任何值。
调用y
时,值fib.next
被“屈服”给调用者。正如您在示例中所看到的,块调用循环并在每次迭代时计算一个值。所以y
是一个积累值的数组。
所以在fib枚举器上调用y
会产生“前10个斐波纳契数。接下来打电话会“屈服”第十一个,依此类推。即使它们不需要,也可以将此枚举器视为“无限”。
另一个人为的例子:
take(10)
这里,枚举器反复产生一个“concat”字符串。 This是一篇较旧的文章,但枚举器是可枚举的,因此您可以使用此类中的方法,也可以通过调用concat = Enumerator.new do |c|
cat = "concat"
loop do
c << cat
cat += "concat"
end
end
p concat.take(5)
来查看。
答案 1 :(得分:0)
我不明白的是,为什么我不能写fib = Enumerator.new,但我必须写fib = Enumerator.new do | y |?
在您拨打next
或take(5)
之前,您已创建了一个不会评估任何内容的枚举器
y
是引用您的枚举器的本地范围变量。基本上,您正在将块枚举器放到块do..end
并在枚举器上应用您自己的逻辑,因此在访问它时,它会计算为您想要的值。