捕获未声明的关键字参数(双 splat)

**运算符与*运算符的工作方式类似,但它适用于关键字参数。

def options(required_key:, optional_key: nil, **other_options)
  other_options
end

options(required_key: 'Done!', foo: 'Foo!', bar: 'Bar!')
#> { :foo => "Foo!", :bar => "Bar!" }

在上面的例子中,如果不使用**other_options,则会引发 ArgumentError: unknown keyword: foo, bar 错误。

def without_double_splat(required_key:, optional_key: nil)
  # do nothing
end

without_double_splat(required_key: 'Done!', foo: 'Foo!', bar: 'Bar!')
#> ArgumentError: unknown keywords: foo, bar

当你想要传递给方法并且不想过滤密钥的选项哈希时,这很方便。

def options(required_key:, optional_key: nil, **other_options)
  other_options
end

my_hash = { required_key: true, foo: 'Foo!', bar: 'Bar!' }

options(my_hash)
#> { :foo => "Foo!", :bar => "Bar!" }

也可以使用**运算符解压缩哈希值。除了来自其他哈希的值之外,这允许你直接向方法提供关键字:

my_hash = { foo: 'Foo!', bar: 'Bar!' }

options(required_key: true, **my_hash)
#> { :foo => "Foo!", :bar => "Bar!" }