0

有一个单对哈希数组,如下所示:

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 上找到这个特定的问题,但如果它在那里,请告诉我。

编辑:在代码示例中添加了上下文。

4

3 回答 3

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
于 2012-08-27T23:50:49.393 回答
2

由于这不是一个常见的习语,所以你不会在那里找到一个真正干净的解决方案。无论如何,这是一个不错的选择:

arguments.map(&:first).each do |key, value|
    # use key and value for something
end

该解决方案利用了这样一个事实,即Hash作为Enumerable,有一个first方法可以返回迭代时产生的第一个结果,所以{:foo => :bar}.first == [:foo, :bar]. 通过所有哈希映射它,你很高兴。

于 2012-08-27T23:56:34.187 回答
1
arguments.each do |arg|
  (key, value), = *arg
  # use my key and value
end

我猜您是否认为这是“更好的方法”主要取决于您的队友是否了解分配在 Ruby 中的工作方式。

于 2012-08-27T23:55:41.477 回答