有一对单对哈希,如下所示:
arguments = [{:name=>"ABCD"},{:title=>"Awesome"},{:number=>4}]
我需要循环并将每个关闭作为键和值。现在,我这样做:
def methodname(*arguments, &block)
arguments.each do |arg|
arg.each do |key, value|
# use my key and value
end
end
# use the &block here in awesome ways
end
伊克。必须是一个更好的方式,所以我问是否有人知道它。我已经搜索过,似乎无法在StackOverflow上找到这个特殊的问题,但请告诉我它是否在那里。
编辑:为代码示例添加了上下文。
答案 0 :(得分:2)
如果预期参数是唯一的......
arguments.inject({},:merge).each { ... }
FWIW - 如果您可以更改此数据结构,那么这样做可能是个好主意。此数据可以在单个哈希中更好地表示。
您还可以以不同方式定义方法并完全避免此问题。
irb(main):011:0> def foo(kwargs={},&block)
irb(main):012:1> pp kwargs
irb(main):013:1> end
irb(main):025:0> foo(:biz=>1,:baz=>2)
{:biz=>1, :baz=>2}
=> nil
答案 1 :(得分:2)
由于这不是一个常见的习语,你不会在那里找到一个非常干净的解决方案。无论如何,这是一个不错的镜头:
arguments.map(&:first).each do |key, value|
# use key and value for something
end
此解决方案充分利用Hash
作为Enumerable
的{{1}}方法返回第一个在迭代时产生的结果这一事实,first
。通过所有哈希映射,你很高兴。
答案 2 :(得分:1)
arguments.each do |arg|
(key, value), = *arg
# use my key and value
end
我猜你是否认为这是一种“更好的方式”,主要取决于你的队友是否理解作业在Ruby中是如何运作的。