代码之家  ›  专栏  ›  技术社区  ›  Jamon Holmgren

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

  •  0
  • Jamon Holmgren  · 技术社区  · 12 年前

    有一个单对散列数组,如下所示:

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

    EDIT:将上下文添加到代码示例中。

    3 回复  |  直到 12 年前
        1
  •  2
  •   dfb    12 年前

    如果参数应该是唯一的。。。

    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
    
        2
  •  2
  •   Matchu    12 年前

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

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

    此解决方案利用了以下事实 Hash ,作为 Enumerable ,具有 first 方法,该方法返回迭代时将产生的第一个结果,因此 {:foo => :bar}.first == [:foo, :bar] 。把它映射到所有的散列中,你就可以开始了。

        3
  •  1
  •   Jörg W Mittag    12 年前
    arguments.each do |arg|
      (key, value), = *arg
      # use my key and value
    end
    

    我想你是否认为这是一种“更好的方式”主要取决于你的队友是否理解Ruby中的任务。