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

链接地址: http://www.djcxy.com/p/60949.html

上一篇: do..end vs curly braces for blocks in Ruby

下一篇: How to check if a specific key is present in a hash or not?