do..end与红宝石块的花括号
我有一位同事积极地试图说服我不应该使用do..end,而是使用大括号来定义Ruby中的多行块。
我坚定地在仅仅使用花括号的阵容中进行短距离单发球员的比赛,并且坚持不懈。 但我想我会接触更大的社区来得到一些解决方案。
那么它是什么,为什么? (一些应用代码的例子)
context do
setup { do_some_setup() }
should "do somthing" do
# some more code...
end
end
要么
context {
setup { do_some_setup() }
should("do somthing") {
# some more code...
}
}
就个人而言,只要看看上面的问题就可以解答我的问题,但我想向更大的社区开放。
一般惯例是使用do..end代替单行块的多行块和花括号,但这两个例子之间也有差别,可以用这个例子来说明:
puts [1,2,3].map{ |k| k+1 }
2
3
4
=> nil
puts [1,2,3].map do |k| k+1; end
#<Enumerator:0x0000010a06d140>
=> nil
这意味着{}的优先级高于..end,因此请在决定要使用的内容时记住这一点。
PS:在制定自己的偏好时要记住另一个例子。
以下代码:
task :rake => pre_rake_task do
something
end
真正意思:
task(:rake => pre_rake_task){ something }
而这个代码:
task :rake => pre_rake_task {
something
}
真正意思:
task :rake => (pre_rake_task { something })
因此,要使用花括号得到您想要的实际定义,您必须:
task(:rake => pre_rake_task) {
something
}
也许使用大括号参数是你想要做的任何事情,但如果你不这样做,它可能是最好的使用do..end在这些情况下,以避免这种混淆。
从编程Ruby:
大括号具有高优先级; 具有低优先级。 如果方法调用的参数不包含在圆括号中,则块的括号形式将绑定到最后一个参数,而不是整个调用。 do表单将绑定到调用。
所以代码
f param {do_something()}
在代码中将块绑定到param
变量
f param do do_something() end
将块绑定到函数f
。
但是,如果将函数参数括在括号中,则这不是问题。
对此有几点看法,这实际上是个人喜好的问题。 许多红宝石主义者采取你所采取的方法。 但是,另外两种常见的样式是始终使用一种或另一种,或者对于返回值的块使用{}
对于为副作用执行的块do ... end
。
上一篇: do..end vs curly braces for blocks in Ruby
下一篇: How to check if a specific key is present in a hash or not?