传递Ruby 2关键字参数而不显式指定它们
如何将关键字参数传递给对代码中另一个方法的调用,而不指定每个方法 考虑以下方法,为kwargs提供新的一流支持:传递Ruby 2关键字参数而不显式指定它们,ruby,ruby-on-rails-4,Ruby,Ruby On Rails 4,如何将关键字参数传递给对代码中另一个方法的调用,而不指定每个方法 考虑以下方法,为kwargs提供新的一流支持: def foo(obj, bar: 'a', baz: 'b') another_method(bar, baz) end 考虑旧的Ruby选项哈希语法: def foo(obj, options = {}) another_method(options) end 我希望传递关键字参数,而不象旧的选项哈希语法那样显式指定每个参数。这可能吗?您可以使用双splat运算符:
def foo(obj, bar: 'a', baz: 'b')
another_method(bar, baz)
end
考虑旧的Ruby选项哈希语法:
def foo(obj, options = {})
another_method(options)
end
我希望传递关键字参数,而不象旧的选项哈希语法那样显式指定每个参数。这可能吗?您可以使用双splat运算符:
def a(q: '1', w: '2')
p q
p w
end
def b(**options)
a(options)
end
b
# => 1
# => 2
b(q: '3', w: '4')
# => 3
# => 4
关键字参数的工作原理类似于“旧Ruby选项哈希语法”。散列的键将替换为关键字,其值将替换为参数。这应该很好:
def foo(obj, bar: 'a', baz: 'b')
another_method(bar, baz)
end
arg_hash = { bar: 'alt bar', baz: 'alt baz' }
foo(Object.new, arg_hash)
需要注意的一些事情
如果散列键是字符串,例如{'bar'=>'alt bar',baz'=>'alt baz'}
,这将不起作用。您将得到一个参数错误:参数数目错误(2代表1)
错误。这很容易在Rails中通过调用散列上的.symbol\u keys
来修复。如果不在Rails中,则必须手动转换键或重新实现该方法
此外,在Rails中,HashWithIndifferentAccess(例如控制器中的
params
hash)虽然同时具有字符串和键符号,但不能以这种方式使用。如果您传递params
,它将查看字符串键,您将得到与上面相同的错误。我不确定为什么会出现这种情况,但我猜这是因为params散列以字符串开头并添加符号,因此符号是次要的,而不是默认的。不过,我完全猜到了。这能回答问题吗?我想用参数调用另一个方法,而不在原始方法中显式指定它们,而不是创建另一个接受任何参数的方法。为什么不呢?该方法不接受任何参数。在我的示例中,如果您尝试b(x:'1')
您将得到未知关键字:x
感谢您指出双splat操作符的存在。我在其他地方找不到有关如何进行此操作的信息。