Ruby for循环中的最佳实践

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

the_count = [1, 2, 3, 4, 5] 
  • for循环1

     for number in the_count puts "This is count #{number}" end 
  • for循环2

     the_count.each do |count| puts "The counter is at: #{count}" end 
  • for loop 3

     the_count.each {|i| puts "I got #{i}"} 

是否存在一种方式比另外两种更好的做法或更好的解决方案? 第一个与其他语言最相似,对我来说,第三个看起来不合时宜。

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

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

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

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

当你应该使用其中一个时,还有其他一些细微差别的意见(例如,有些人在编写function块时总是使用括号forms,即即使它们更长时也不会影响块的外部),但如果按照上述建议,至少有98%的ruby开发人员会阅读您的代码。

因此,总之,避免for i in ...变体( whileuntil ,…的相同计数)并始终使用块forms。 对复杂块使用doend ;对于简单的单行块,使用braces-form。

但是,当您使用块forms时,您应该知道链接方法时优先级的细微差别。

这个

 foo bar { |i| puts i } 

相当于

 foo(bar{|i| puts i}) 

 foo bar do |i| puts i end 

相当于

 foo(bar) { |i| puts i } 

正如您所看到的,在大括号forms中,块被传递到最右边的方法,而在doendforms中,块被传递到最左边的方法。 您总是可以用括号解决歧义。

应该注意的是,这是在惯用的Ruby (解决方案2和3)和高性能的Ruby (使用while循环,因为for …in使用each循环中)之间的权衡,如在另一种语言速度测试:计数素数中所指出的:

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

虽然通常鼓励选择惯用的Ruby,但是在完全有效的情况下你想忽略这些建议。