Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
传递Ruby 2关键字参数而不显式指定它们_Ruby_Ruby On Rails 4 - Fatal编程技术网

传递Ruby 2关键字参数而不显式指定它们

传递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运算符:

如何将关键字参数传递给对代码中另一个方法的调用,而不指定每个方法

考虑以下方法,为kwargs提供新的一流支持:

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操作符的存在。我在其他地方找不到有关如何进行此操作的信息。