我什么时候可以省略Ruby哈希的大括号?

我什么时候可以省略Ruby哈希的大括号?,ruby,Ruby,这在Ruby中是合法的: puts key: "value" {:key=>“value”} 但这不是: hsh = key: "value" puts hsh rb:1:语法错误,意外的“:”,应为输入结束 hsh=键:“值” 为什么不呢?什么时候可以为哈希省略大括号?当哈希是方法调用的最后一个参数时,可以省略大括号。当你写作时: puts key: 'value' 实际上,您使用参数{key:value}调用put方法,因此您可以编写: puts({key: 'value'}) 但

这在Ruby中是合法的:

puts key: "value"
{:key=>“value”}

但这不是:

hsh = key: "value"
puts hsh
rb:1:语法错误,意外的“:”,应为输入结束

hsh=键:“值”


为什么不呢?什么时候可以为哈希省略大括号?

当哈希是方法调用的最后一个参数时,可以省略大括号。当你写作时:

 puts key: 'value'
实际上,您使用参数
{key:value}
调用
put
方法,因此您可以编写:

puts({key: 'value'})
但在Ruby中,您可以跳过普通大括号和花括号

看看它是如何工作的,请考虑下面的例子:

# Hash as only paramter
puts(a:1)
#{:a=>1}

# Hash as a last parameter
puts('cat', a: 1)
#cat
#{:a=>1}

# Hash as a first parameter - cannot skip
puts(a: 1, 'cat')
# >> SyntaxError: unexpected ')', expecting =>
# >> puts(a: 1, 'cat')
                ^
puts({a: 1}, 'cat')
#{:a=>1}
#cat

# Two hashes
puts({a: 1}, {b: 2})
#{:a=>1}
#{:b=>2}

puts({a: 1}, b: 2)
#{:a=>1}
#{:b=>2}

当散列是传递给函数的最后一个参数时,可以省略大括号。例如,在Rails
link\u to
helper中的选项不需要它们,但在
hsh=key:“value”
示例中确实需要它们,因为散列没有函数作为参数。

这是唯一一次我可以省略花括号吗?我还看到了一种惯例,即当大括号是函数调用的最后一个参数时,可以省略大括号。如果不是呢?我想不起还有什么其他情况可以写
key:'value'
而不是
{key:'value'}
。你有没有考虑过一些麻烦的例子?Ruby只允许省略最后一个参数的大括号(参见我的答案)。如果您尝试使用一个后面有另一个参数的参数,它将失败,因为Ruby无法处理-毕竟它必须做出一些假设。根据这些建议进行更新。不是在提供的上下文中,而是从技术上讲,
instance.attribute=
是一个方法调用,但在这种情况下也不能忽略大括号。