使用散列作为参数时,没有花括号有区别吗?
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 可能会将您的散列误认为代码块。
这两个表达方式好像没什么区别
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 可能会将您的散列误认为代码块。