使用散列作为参数时,没有花括号有区别吗?

Is there a difference without curly braces when using hash as an argument?

这两个表达方式好像没什么区别

h = {a: 1, b: 2}
h.merge({c: 3, d: 4})
h.merge(c: 3, d: 4)

如果我在使用Hash作为参数时省略花括号,是否会出现问题?

不,两个版本之间没有区别。

此外,当散列是方法的最后一个参数时,省略大括号是一种常见的 Ruby/Rails 习惯用法。比较以下常见示例:

validates :foo, { presence: true }
validates :foo, presence: true

link_to "Foos", foo_path, { class: "foo" }
link_to "Foos", foo_path, class: "foo"

有 2 个 "ways" 或声明哈希的语法,旧的和新的;

旧方法非常死板,因为它遵循以下公式: 括号(大括号{、space</code>、键对象(通常是<em>:symbol</em>,但可以是任何其他东西)<code>:one、space、哈希火箭和 space =>、值对象 1、闭包。整个事情看起来像这样:

hash_object = ({ :one => 1, :two => 2 })

跳过 space 可以,但这不是正确的语法。

新语法的构建是为了让经常使用 JSON 的人服从,因此新语法没有使用 EXPLICIT 符号(即上一个示例中的 :one),而是强制键是符号 class,并遵循一个更简单的公式: 括号(,键名one,冒号:,(可选space</code>),值<code>1,和关闭。在新语法下,哈希创建将如下所示:

hash_object = (one: 1, two: 2)

如您所见,新语法比旧语法更简单,但不够灵活,因为它强制将符号作为键,而且不够直观。

最后,还有其他有用的 "idioms" 或围绕散列的快捷方式;例如,如果您使用散列作为 method/function、 的参数并且它是最后一个参数 ,那么您可以使用没有括号和 [=58 的新语法=] 会将 key/value 对链解释为一个唯一参数:

method arg1, arg2, a: 1, b: 2, c:3

相同
method(arg1, arg2, ({ :a => 1, :b => 2, :c => 3 }))

我的建议是坚持旧的、死板的形式!。 Ruby 旨在让开发人员直观且易于阅读,而不是 "elegant" 或简短。使用旧语法会迫使您思考自己在做什么,并且调试起来会非常容易,因为您在提供散列时确切地知道 Ruby 是什么 "thinking"。最后一句警告:也要使用括号!不要跳过它们,否则有时 Ruby 可能会将您的散列误认为代码块。