使用可选参数后跟一个关键字参数列表处理方法

Tas*_*tto 5 ruby arguments splat

我想传递一个可选参数(任何数据类型,甚至是哈希),然后是一个方法的关键字参数列表(可以为空).

这就是我得到的:

def my_method(subject = nil, **options)
  [subject, options]
end
Run Code Online (Sandbox Code Playgroud)

在以下情况下,方法输出符合预期:

当传递Hash作为主题而没有选项时,期望的结果是:

my_method({foo: 'foo'})
# => [{:foo=>"foo"}, {}]
Run Code Online (Sandbox Code Playgroud)

但我得到以下内容; 我没有得到正确的主题:

my_method({foo: 'foo'})
# => [nil, {:foo=>"foo"}]
Run Code Online (Sandbox Code Playgroud)

my_method(foo: 'foo')相当于my_method({foo: 'foo'})?关于如何获得理想结果的任何想法?

ray*_*ray 3

看,您的**options参数没有任何默认值,并且第一个参数有默认值。所以理解下面的单参数案例

每当传递单个参数时,它都会尝试分配给第二个参数(因为第一个参数默认为 nil),如果由于类型不匹配而失败,则它将分配给第一个参数。就是这样my_method(4)工作的。

现在假设您有单个参数作为哈希传递,它匹配分配给第二个参数,那么它当然会分配给第二个参数,并且第一个参数设置为默认 nil。

如果你想让它工作,那么你可以执行以下操作,

> my_method({sd: 4}, {})
 => [{:sd=>4}, {}]
Run Code Online (Sandbox Code Playgroud)

或者您可以在传递时提供参数名称,

> my_method(subject: {sd: 4})
 => [{:sd=>4}, {}]
Run Code Online (Sandbox Code Playgroud)