Answers:
Ruby 2.0引入了关键字参数,其**
行为类似于*
,但用于关键字参数。它返回带有键/值对的哈希。
对于此代码:
def foo(a, *b, **c)
[a, b, c]
end
这是一个演示:
> foo 10
=> [10, [], {}]
> foo 10, 20, 30
=> [10, [20, 30], {}]
> foo 10, 20, 30, d: 40, e: 50
=> [10, [20, 30], {:d=>40, :e=>50}]
> foo 10, d: 40, e: 50
=> [10, [], {:d=>40, :e=>50}]
这是从Ruby 2.0开始可用的double splat运算符。
它捕获所有关键字参数(也可以是一个简单的哈希,这是在关键字参数成为Ruby语言的一部分之前模拟关键字参数的惯用方式)
def my_method(**options)
puts options.inspect
end
my_method(key: "value")
上面的代码将打印{key:value}
到控制台。
就像单个splat运算符捕获所有常规参数一样,但是您得到的不是hash而是数组。
现实生活中的例子:
例如在Rails中,cycle
方法如下所示:
def cycle(first_value, *values)
options = values.extract_options!
# ...
end
这种方法可以这样调用:cycle("red", "green", "blue", name: "colors")
。
这是一种很常见的模式:您接受一个参数列表,最后一个是选项哈希,可以使用ActiveSupport的方法将其提取(例如)extract_options!
。
在Ruby 2.0中,您可以简化以下方法:
def cycle(first_value, *values, **options)
# Same code as above without further changes!
end
诚然,如果您已经在使用ActiveSupport,这只是一个较小的改进,但是对于纯Ruby,代码获得了很多简洁。
opts = {d: 40, e: 50}
,foo 10, opts, f: 60
则将分配{f: 60}
给c
,而foo 10, **opts, f: 60
将分配{d: 40, e: 50, f: 60}
。为了获得第二个效果,以前您必须merge
显式创建数组。