带有可选和关键字参数的方法

时间:2017-10-25 15:24:01

标签: ruby

def test(a, b = {}, c: 1)
  [a, b, c]
end

test 1, {hello: :world}

我希望这个输出是:

[1, {hello: :word}, 1]

但我得到了:

ArgumentError: unknown keyword: hello

我读过一些像https://makandracards.com/makandra/36011-ruby-do-not-mix-optional-and-keyword-arguments

这样的网页

建议不要将可选参数与关键字参数混合使用。

可以使这项工作吗?

1 个答案:

答案 0 :(得分:2)

如果你想要这个确切的签名,你可能应该使用双重splat来b参数:

def test(a, c: 1, **b)
  [a, b, c]
end
test 1, {hello: :world}
#⇒ [1, {hello: :word}, 1]

当命名关键字参数和哈希本身紧接在命名关键字之前传递时,存在区分命名关键字参数和哈希本身的问题。