在 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?
在 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?