Ruby自动将Hash扩展为关键字参数,而不需要双splat

时间:2015-07-16 20:26:32

标签: ruby

以下Ruby代码导致:unknown keyword: a (ArgumentError)

def test(x={}, y: true); end

test({a:1})

为什么呢?我希望test(**{a:1})会发生这种情况,但我不明白为什么我的哈希值会在没有双splat的情况下自动扩展。

2 个答案:

答案 0 :(得分:3)

由于x是可选的,所以hash转移到kwarg参数。 在这种情况下,未指定的关键字会引发错误:

def foo(name:)
  p name
end

foo # raises "ArgumentError: missing keyword: name" as expected
foo({name: 'Joe', age: 10}) # raises "ArgumentError: unknown keyword: age"

查看this文章

答案 1 :(得分:1)

我也发现它是一个错误,因为它的行为非常不一致,仅适用于Symbol类型的键的哈希:

test({a:1})  # raises ArgumentError
test({'a' => 1})  # nil, properly assigned to optional argument x
method(:test).parameters
=> [[:opt, :x], [:key, :y]]

您可以传递两个参数并开始正确分配它们,但这不是解决方案。

test({a:1}, {y:false})  # nil

为什么这不是一个错误而是预期的行为?