我有一个同事积极地试图说服我不应该使用 do..end 而是使用花括号在 Ruby 中定义多行 block 。
我坚定地坚持只对短的单行代码使用大括号,对其他一切都使用 do..end。但我想我会接触更大的社区以获得一些解决方案。
那么它是什么,为什么? (一些shoulda代码的例子)
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...
}
}
就我个人而言,仅看上面的内容就可以回答我的问题,但我想向更大的社区开放这个问题。
最佳答案
一般惯例是对多行 block 使用 do..end,对单行 block 使用花括号,但两者之间也有区别,可以用这个例子来说明:
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
这意味着 {} 的优先级高于 do..end,因此在决定要使用什么时请记住这一点。
在您形成偏好时要牢记的另一个例子。
以下代码:
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-on-rails - do..end 与 Ruby 中 block 的花括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5587264/