我有一个关于Ruby循环的问题。这两种遍历集合的方法有区别吗?
# way 1
@collection.each do |item|
# do whatever
end
# way 2
for item in @collection
# do whatever
end
只是想知道这些是否完全相同,或者是否可能有细微的差异(可能在@collection为nil时)。
我有一个关于Ruby循环的问题。这两种遍历集合的方法有区别吗?
# way 1
@collection.each do |item|
# do whatever
end
# way 2
for item in @collection
# do whatever
end
只是想知道这些是否完全相同,或者是否可能有细微的差异(可能在@collection为nil时)。
当前回答
据我所知,使用块而不是语言内的控制结构更习惯。
其他回答
第一个例子,
@collection.each do |item|
# do whatever
end
更习惯用语。虽然Ruby支持for和While等循环结构,但块语法通常是首选。
另一个微妙的区别是,在for循环中声明的任何变量在循环之外都是可用的,而迭代器块中的变量实际上是私有的。
请参阅“For循环的弊端”以获得更好的解释(考虑到变量作用域,有一个小区别)。
使用这两种都被认为是Ruby更习惯的用法。
据我所知,使用块而不是语言内的控制结构更习惯。
(1..4).each { |i|
a = 9 if i==3
puts a
}
#nil
#nil
#9
#nil
for i in 1..4
a = 9 if i==3
puts a
end
#nil
#nil
#9
#9
在for循环中,局部变量在每次循环后仍然有效。在“each”循环中,局部变量在每次循环后都会刷新。
还有一个不同的…
number = ["one", "two", "three"]
=> ["one", "two", "three"]
loop1 = []
loop2 = []
number.each do |c|
loop1 << Proc.new { puts c }
end
=> ["one", "two", "three"]
for c in number
loop2 << Proc.new { puts c }
end
=> ["one", "two", "three"]
loop1[1].call
two
=> nil
loop2[1].call
three
=> nil
来源:http://paulphilippov.com/articles/enumerable-each-vs-for-loops-in-ruby
想要更清楚:http://www.ruby-forum.com/topic/179264#784884