愚弄for for iterator

时间:2014-08-07 07:06:05

标签: ruby loops iterator

以下代码来自我审核的程序。它计算第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实际上不会影响迭代器。迭代器是否可以使用foreachtimes循环移动到某个迭代?

也欢迎任何关于这些迭代器如何工作的参考。

2 个答案:

答案 0 :(得分:4)

首先,这是您想要的参考资料:

回答你的问题:

  1. 说我是块参数是否正确?

    没有。 for不会引入新的变量范围或使用块。

  2. for语句在功能上与(2..input.to_i).each do |i|相同吗?

    没有。 for i in ...在执行i的范围内创建变量for,而each则不会这样做(IIRC早期的Ruby版本执行此操作)。

    < / LI>
  3. 迭代器是否可以移动到某个迭代?

    你可以像这样跳过或重做单次迭代(也可以在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现在响应rewindpeek等内容(请参阅上面链接的文档)。

答案 1 :(得分:3)

for确实只是each的糖(尝试在不可枚举的对象上使用for - 它应该抱怨它没有响应每个)。它的不同之处在于它不会创建块范围。

如何实现each取决于您调用它的对象(每个都是构建所有Enumerable的方法)。在任何情况下,将使用一系列值调用块。重新分配产生的块变量什么都不做 - 在下一次迭代时i被设置为下一个值应该是什么。

您可以使用next跳过或以break结束,但就控制迭代而言也是如此 - 没有办法说&#34;向前跳3&#34;