ruby-on-rails - do..end 与 Ruby 中 block 的花括号

标签 ruby-on-rails ruby ruby-on-rails-3 coding-style

我有一个同事积极地试图说服我不应该使用 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/

相关文章:

ruby - 将字符串对象转换为事件记录类

ruby-on-rails - 在 Ruby 中运行 eval 有安全的方法吗?

ruby-on-rails - 如何从多个地方重定向到上一页?

ruby - 枚举器如何在 Ruby 1.9.1 中工作?

ruby - 从流 block 写入文件

ruby-on-rails - rails : How to increment an integer field of selected instances of a model?

ruby-on-rails - Rails - 能够启用/禁用 View 上的链接?

ruby-on-rails - accepts_nested_attributes_for 不保存回形针图像

ruby - Rails s 不启动服务器,没有错误消息

ruby - 在 Ruby on Rails 应用程序中实现匹配算法