Ruby for循环中的最佳实践

时间:2015-07-07 08:32:15

标签: ruby for-loop

我遇到了三种编写循环的方法。

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}"}
    

在某种情况下,哪种方式比其他方式更好或更好?第一个与其他语言最相似,对我来说,第三个看起来不合时宜。

2 个答案:

答案 0 :(得分:13)

通常不鼓励第一种选择。 ruby可能对来自其他语言的开发人员更加友好(因为他们认识到语法)但是对于可变可见性它有点奇怪。通常,您应该在任何地方避免使用此变体,并且只使用其中一个块变体。

另外两个变体的优点在于它对于接受块的所有方法都是相同的,例如, mapreducetake_while和其他人。

两个底部变体大多等同您使用each方法并为其提供一个块。 each方法为数组中的每个元素调用一次块。

您使用哪一个主要取决于偏好。大多数人倾向于使用带括号的那个用于不需要换行的简单块。如果您想在块中使用换行符,例如如果您有多个语句,则应使用do ... end变体。这使您的代码更具可读性。

当你应该使用其中一个时,还有其他一些细微差别的意见(例如,有些人在编写功能块时总是使用括号形式,即即使长时间不影响块外部的那些) ,但如果您遵循以上建议,至少有98%的红宝石开发人员会阅读您的代码。

因此,最后,请避免使用for i in ...变体(whileuntil,......的相同计数)并始终使用块形式。对复杂块使用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 …inYet Another Language Speed Test: Counting Primes

中所述,在引擎盖下使用each
  

值得注意的是,应该提到的是,编写惯用的Python和Ruby会导致代码比此处使用的代码慢得多。范围不好。虽然循环很好。

虽然人们普遍鼓励他们选择惯用的Ruby,但是在完全有效的情况下你可以忽略这些建议。