以下代码来自我审核的程序。它计算第n个斐波纳契数:
for i in 2..input.to_i
fibonacci = a + b
a = b
b = fibonacci
i += 1 # <- This
end
注释行i += 1
实际上什么也没做。
说i
是块参数是否正确?即for
语句在功能上与(2..input.to_i).each do |i|
相同吗?
行i += 1
实际上不会影响迭代器。迭代器是否可以使用for
,each
或times
循环移动到某个迭代?
也欢迎任何关于这些迭代器如何工作的参考。
答案 0 :(得分:4)
首先,这是您想要的参考资料:
回答你的问题:
说我是块参数是否正确?
没有。 for
不会引入新的变量范围或使用块。
for
语句在功能上与(2..input.to_i).each do |i|
相同吗?
没有。 for i in ...
在执行i
的范围内创建变量for
,而each
则不会这样做(IIRC早期的Ruby版本执行此操作)。
迭代器是否可以移动到某个迭代?
你可以像这样跳过或重做单次迭代(也可以在each
次迭代中):
wait_until = Time.now + 10
for i in [1,2,3]
redo if Time.now < wait_until # actively sleep
next if i.even?
end
但你不能跳到任意位置。
为了更好地控制迭代,您需要一个Enumerator
实例。如果你在没有参数/块的情况下调用each
,你将得到一个枚举器:
enum = [1,2,3].each
begin
while i = enum.next
puts i
end
rescue StopIteration
end
# equivalent to
# [1,2,3].each {|i| puts i }
enum
现在响应rewind
,peek
等内容(请参阅上面链接的文档)。
答案 1 :(得分:3)
for
确实只是each
的糖(尝试在不可枚举的对象上使用for
- 它应该抱怨它没有响应每个)。它的不同之处在于它不会创建块范围。
如何实现each
取决于您调用它的对象(每个都是构建所有Enumerable的方法)。在任何情况下,将使用一系列值调用块。重新分配产生的块变量什么都不做 - 在下一次迭代时i
被设置为下一个值应该是什么。
您可以使用next
跳过或以break
结束,但就控制迭代而言也是如此 - 没有办法说&#34;向前跳3&#34;