Tas*_*tto 5 ruby arguments splat
我想传递一个可选参数(任何数据类型,甚至是哈希),然后是一个方法的关键字参数列表(可以为空).
这就是我得到的:
def my_method(subject = nil, **options)
[subject, options]
end
Run Code Online (Sandbox Code Playgroud)
在以下情况下,方法输出符合预期:
没有
my_method()
# => [nil, {}]
Run Code Online (Sandbox Code Playgroud)课程
my_method('foo')
# => ["foo", {}]
Run Code Online (Sandbox Code Playgroud)一个有选项的文字主题
my_method('foo', bar: 'bar')
# => ["foo", {:bar=>"bar"}]
Run Code Online (Sandbox Code Playgroud)a Hash作为选项的主题
my_method({foo: 'foo'}, bar: 'bar')
# => [{:foo=>"foo"}, {:bar=>"bar"}]
Run Code Online (Sandbox Code Playgroud)没有主题,只有选项
my_method(bar: 'bar')
# => [nil, {:bar=>"bar"}]
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'})?关于如何获得理想结果的任何想法?
看,您的**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)