Ruby for循环中的最佳实践

Kev*_*gst 6 ruby for-loop

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

the_count = [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

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

Hol*_*ust 13

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

两个其他变体的优点是,它适用于接受块,例如,所有的方法都是一致的map,reduce,take_while和其他人.

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

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

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

因此,在总结,避免for i in ...变种(相同计数while,until......),并一直使用块形.使用do... end的块复杂的块和括号,形式简单的单行块.

当您使用块形式时,您应该知道链接方法时优先级的细微差别.

这个

foo bar { |i| puts i }
Run Code Online (Sandbox Code Playgroud)

相当于

foo(bar{|i| puts i})
Run Code Online (Sandbox Code Playgroud)

foo bar do |i|
  puts i
end
Run Code Online (Sandbox Code Playgroud)

相当于

foo(bar) { |i| puts i }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在大括号形式中,块被传递到最右侧的方法,而在do... end形式中,块被传递到最左侧的方法.您总是可以用括号解决歧义.