在 Ruby 中,如何在没有括号的情况下将多个散列传递给一个方法?

In Ruby, how can you pass more than one hash to a method, without parentheses?

在 Ruby 中,如何不带括号将多个散列传递给一个方法?

例如

def abc x,y
end

abc {4,5},{6,4} <-- syntax error, unexpected ',', expecting '}'

Mu​​ 指出,如果您将它们作为 non-literals 传递,即作为变量传递,您可以传递多个不带括号的哈希值。

但除此之外,对于文字哈希,

你可以(需要括号来传递多个文字哈希值),除非你传递关键字参数。你可以传递多个关键字参数而不用括号。

关键字参数是指方法的参数包含冒号,例如def blah x:, y: 然后你可以用 blah y:2,x:3 打电话。有时您必须查看参数以查看参数是否为关键字参数,例如如果你有一个用 abc x:3 调用的方法 那可能是 def abc x: 在这种情况下你用关键字参数调用它。或者它可能是 def abc x,在这种情况下,您使用散列调用它,省略了 {}。

当我说关键字参数时,我不是指哈希..反之亦然,当我说哈希时,我指的不是关键字参数。

当调用不带括号时,您只能传递一个散列,并且该散列必须是最后一个参数。您可以跳过它周围的 {}。

注意-我不是专家,但是关于关键字参数是否是一种散列的相关问题,据我所知,在 ruby 3 之前,它们是,但有人提议 ruby 3 具有 'real' 与散列不同的关键字参数 https://bugs.ruby-lang.org/issues/14183

关键字参数不能是 multi-valued。

此外,散列可以自动转换为关键字参数。 (例如,如果一个方法是用关键字参数定义的,您可以在例如 {x:"a"} 中传递一个散列,x 是一个符号,并且该散列将被转换为关键字参数 x:"a" (x 是参数名称)。

我将添加关于块和括号的一点,因为使用 {} 完成的块确实看起来有点像散列,但不是散列。并且块可以对是否需要括号产生一些影响。

如果您看到 abc {},则 {} 是块而不是哈希,并且块不算作参数。因此,该调用适用于 def abc 但不适用于 def abc x ,后者会收到与传递的参数数量相关的错误。

即使在一些其他参数之后传递一个块,块之前也不应该有逗号,如果用 {} 完成的块后面有一些参数,则需要括号,但如果用 do .. end 后面有一些参数,不需要括号

建议在有多个参数时使用括号,除非它是 DSL(领域特定语言)。 Do you leave parentheses in or out in Ruby?