Ruby:for循环和each循环有什么区别? [重复]

|                                                                                                                   这个问题已经在这里有了答案:                                                      
已邀请:
关于范围的定义存在细微的差异,但是我建议您对其进行充分的了解,因为它揭示了Ruby的一些重要方面。 “ 0”是语法构造,与“ 1”有些相似。无论您在
for
块中定义什么,都将在remain0ѭ之后保持定义:
sites = %w[stackoverflow stackexchange serverfault]
#=> [\"stackoverflow\", \"stackexchange\", \"serverfault\"]

for x in sites do
  puts x
end
stackoverflow
stackexchange
serverfault
#=> [\"stackoverflow\", \"stackexchange\", \"serverfault\"]
x
#=> \"serverfault\"
另一方面,“ 5”是接收块的方法。 Block引入了新的词法作用域,因此,在方法完成后,您在其中引入的任何变量都将不再存在:
sites.each do |y|
  puts y
end
stackoverflow
stackexchange
serverfault
#=> [\"stackoverflow\", \"stackexchange\", \"serverfault\"]
y
NameError: undefined local variable or method `y\' for #<Object:0x855f28 @hhh=\"hello\">
    from (irb):9
    from /usr/bin/irb:12:in `<main>\'
我建议完全不要忘记ѭ0,因为在Ruby中遍历可枚举对象时经常使用
each
。通过减少副作用的机会,它也更好地展望了函数式编程的范式。     
sites.each
作用于块内的
x
,而
for
如果在块外声明,将重用
x
。因此,通常最好使用ѭ5,这样可以最大程度地减少较大代码段的副作用。     
CBZ答案是正确的,但不完整,因为1.8.X和1.9.X之间的行为有所不同: 1.9.2 IRB:
ruby-1.9.2-p180 :001 > x = [1,2,3,4,5]
 => [1, 2, 3, 4, 5] 
ruby-1.9.2-p180 :002 > y = [\"a\",\"b\"]
 => [\"a\", \"b\"] 
ruby-1.9.2-p180 :003 > x.each do |y|
ruby-1.9.2-p180 :004 >     p y
ruby-1.9.2-p180 :005?>   end
1
2
3
4
5
 => [1, 2, 3, 4, 5] 
ruby-1.9.2-p180 :006 > y
 => [\"a\", \"b\"] 
1.8.7内部评级法:
ree-1.8.7-2011.03 :001 > x = [1,2,3,4,5]
 => [1, 2, 3, 4, 5] 
ree-1.8.7-2011.03 :002 > y = [\"a\",\"b\"]
 => [\"a\", \"b\"] 
ree-1.8.7-2011.03 :003 > x.each do |y|
ree-1.8.7-2011.03 :004 >     p y
ree-1.8.7-2011.03 :005?>   end
1
2
3
4
5
 => [1, 2, 3, 4, 5] 
ree-1.8.7-2011.03 :006 > y
 => 5 
    
CBZ答案是正确的。为了说明这一点,请参见以下示例:
ruby-1.9.2-p180 :001 > a = %w{ blah lah kah }
 => [\"blah\", \"lah\", \"kah\"] 
ruby-1.9.2-p180 :002 > x = 1
 => 1 
ruby-1.9.2-p180 :003 > for x in a do
ruby-1.9.2-p180 :004 >     puts x
ruby-1.9.2-p180 :005?>   end
blah
lah
kah
 => [\"blah\", \"lah\", \"kah\"] 
ruby-1.9.2-p180 :006 > x
 => \"kah\" 
ruby-1.9.2-p180 :007 > x=1
 => 1 
ruby-1.9.2-p180 :008 > a.each do |x|
ruby-1.9.2-p180 :009 >     puts x
ruby-1.9.2-p180 :010?>   end
blah
lah
kah
 => [\"blah\", \"lah\", \"kah\"] 
ruby-1.9.2-p180 :011 > x
 => 1 
    

要回复问题请先登录注册