Ruby 玩弄for迭代器

Ruby 玩弄for迭代器,ruby,loops,iterator,Ruby,Loops,Iterator,下面的一段代码来自我复习过的一个程序。它计算第n个斐波那契数: for i in 2..input.to_i fibonacci = a + b a = b b = fibonacci i += 1 # <- This end 用于输入2..input.to_i 斐波那契=a+b a=b b=斐波那契 i+=1#for实际上对于每一个(尝试在不可枚举的对象上使用for,它应该抱怨它对每一个都没有响应)。它的不同之处在于它不创建块范围 每个的实现方式

下面的一段代码来自我复习过的一个程序。它计算第n个斐波那契数:

for i in 2..input.to_i
  fibonacci = a + b
  a = b
  b = fibonacci
  i += 1            # <-  This
end
用于输入2..input.to_i
斐波那契=a+b
a=b
b=斐波那契

i+=1#
for
实际上对于
每一个
(尝试在不可枚举的对象上使用
for
,它应该抱怨它对每一个都没有响应)。它的不同之处在于它不创建块范围

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


你可以用
next
跳过,也可以用
break
终止,但就控制迭代而言,这就是问题所在-没有办法说“向前跳3”

,因为
实际上对于
每一个
(尝试在不可枚举对象上使用
for
,它应该抱怨它没有响应每个对象)。它的不同之处在于它没有创建块范围

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


您可以使用
next
跳过,也可以使用
break
终止,但就控制迭代而言,这就是问题所在-没有办法说“向前跳3”

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

回答您的问题:

  • 说i是块参数正确吗?

    否。的
    不会引入新的变量范围或使用块

  • 语句在功能上与
    (2..input.to_i.)相同。每个do | i |

    否。
    for i in…
    在执行
    for
    的范围内创建变量
    i
    ,而
    每个
    都不会这样做(IIRC早期Ruby版本就是这样做的)

  • 迭代器是否可以移动到某个迭代?

    您可以像这样跳过或重做单个迭代(也可以在
    每次迭代中进行):

    enum
    现在可以响应
    倒带
    peek
    等操作(请参见上面链接的文档)


  • 首先,以下是您想要的参考资料:

    回答您的问题:

  • 说i是块参数正确吗?

    否。
    不会引入新的变量范围或使用块

  • 语句在功能上与
    (2..input.to_i.)相同。每个do | i |

    否。
    for i in…
    在执行
    for
    的范围内创建变量
    i
    ,而
    每个
    都不会这样做(IIRC早期Ruby版本就是这样做的)

  • 迭代器是否可以移动到某个迭代?

    您可以像这样跳过或重做单个迭代(也可以在
    每次迭代中进行):

    enum
    现在可以响应
    倒带
    peek
    等操作(请参见上面链接的文档)


  • 我认为你的第二点有点误导。是的,严格地说,它并不完全相同,因为变量范围不同。然而,ISO Ruby语言规范的第11.5.2.3.4节说,
    对于var1,var2在表达式中;do_something end
    确实被评估为
    表达式。每个do | var1,var2 | do|u something结束
    除了块没有自己的作用域之外。因此,作用域是唯一的区别,否则它实际上只是一个纯粹的局部语法翻译(即语法糖)对于
    每一个
    。你确实是对的,让我在以后有空的时候重写这一点……我认为你的第二点有点误导。是的,严格地说,它并不完全相同,因为变量范围不同。然而,ISO Ruby语言规范的第11.5.2.3.4节说,
    对于var1,var2在ex中pression;do|u something end
    确实被评估为
    表达式。每个do | var1,var2 | do|u something end
    除了块没有自己的作用域之外。因此,作用域是唯一的区别,否则它实际上只是一个纯粹的局部语法翻译(即语法糖)对于
    每一个
    。你确实是对的,让我在以后有空的时候重写这一点。。。
    
    wait_until = Time.now + 10
    for i in [1,2,3]
      redo if Time.now < wait_until # actively sleep
      next if i.even?
    end
    
    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 }