Ruby 玩弄for迭代器
下面的一段代码来自我复习过的一个程序。它计算第n个斐波那契数: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,它应该抱怨它对每一个都没有响应)。它的不同之处在于它不创建块范围 每个的实现方式
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”首先,这里是您想要的参考:
不会引入新的变量范围或使用块
语句在功能上与(2..input.to_i.)相同。每个do | i |
?
否。for i in…
在执行for
的范围内创建变量i
,而每个
都不会这样做(IIRC早期Ruby版本就是这样做的)每次迭代中进行):
enum
现在可以响应倒带
、peek
等操作(请参见上面链接的文档)
首先,以下是您想要的参考资料:
不会引入新的变量范围或使用块
语句在功能上与(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 }