我遇到了三种编写循环的方法。
the_count = [1, 2, 3, 4, 5]
for loop 1
for number in the_count
puts "This is count #{number}"
end
for loop 2
the_count.each do |count|
puts "The counter is at: #{count}"
end
for loop 3
the_count.each {|i| puts "I got #{i}"}
在某种情况下,哪种方式比其他方式更好或更好?第一个与其他语言最相似,对我来说,第三个看起来不合时宜。
答案 0 :(得分:13)
通常不鼓励第一种选择。 ruby可能对来自其他语言的开发人员更加友好(因为他们认识到语法)但是对于可变可见性它有点奇怪。通常,您应该在任何地方避免使用此变体,并且只使用其中一个块变体。
另外两个变体的优点在于它对于接受块的所有方法都是相同的,例如, map
,reduce
,take_while
和其他人。
两个底部变体大多等同您使用each
方法并为其提供一个块。 each
方法为数组中的每个元素调用一次块。
您使用哪一个主要取决于偏好。大多数人倾向于使用带括号的那个用于不需要换行的简单块。如果您想在块中使用换行符,例如如果您有多个语句,则应使用do
... end
变体。这使您的代码更具可读性。
当你应该使用其中一个时,还有其他一些细微差别的意见(例如,有些人在编写功能块时总是使用括号形式,即即使长时间不影响块外部的那些) ,但如果您遵循以上建议,至少有98%的红宝石开发人员会阅读您的代码。
因此,最后,请避免使用for i in ...
变体(while
,until
,......的相同计数)并始终使用块形式。对复杂块使用do
... end
块,对简单的单行块使用括号形式。
当您使用块形式时,您应该知道链接方法时优先级的细微差别。
此
foo bar { |i| puts i }
相当于
foo(bar{|i| puts i})
而
foo bar do |i|
puts i
end
相当于
foo(bar) { |i| puts i }
正如您所看到的,在大括号形式中,块被传递到最右侧的方法,而在do
... end
形式中,块被传递到最左侧方法。您总是可以用括号解决歧义。
答案 1 :(得分:0)
应该注意的是,这是在惯用Ruby (解决方案2和3)和高性能Ruby 之间进行权衡(使用while循环,因为for …in
如Yet Another Language Speed Test: Counting Primes:
each
值得注意的是,应该提到的是,编写惯用的Python和Ruby会导致代码比此处使用的代码慢得多。范围不好。虽然循环很好。
虽然人们普遍鼓励他们选择惯用的Ruby,但是在完全有效的情况下你可以忽略这些建议。