Ruby - 轻松获取哈希数组中的键和值

时间:2012-08-27 23:38:56

标签: ruby rubymotion

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

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

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

3 个答案:

答案 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中是如何运作的。