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

Ruby-轻松地从哈希数组中获取键和值,ruby,rubymotion,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

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

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上搜索过,似乎找不到这个问题,但请告诉我是否有


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

如果参数预期是唯一的

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

如果参数预期是唯一的

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
我想你是否认为这是一个更好的方法,这主要取决于你的队友是否理解露比如何分配任务。
我猜你是否认为这是“更好的方法”主要取决于你的队友是否理解露比的作业。

< P>因为这不是一个普通的习惯用法,你不会在那里找到一个真正干净的解决方案。不管怎样,这里有一个不错的机会:

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

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

因为这不是一个常见的习惯用法,你不会找到一个真正干净的解决方案。不管怎样,这里有一个不错的机会:

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


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

这…在我看来其实没那么糟糕。迭代一个数组,它取一行,迭代散列中的每个键值对,它取一行。这就很简单了。我怀疑他想避免“迭代每个键值对”,因为只有一个键值对。@JörgWMittag:啊,好主意。明白了,那…在我看来其实没那么糟糕。迭代一个数组,它取一行,迭代散列中的每个键值对,它取一行。这就很简单了。我怀疑他想避免“迭代每个键值对”,因为只有一个键值对。@JörgWMittag:啊,好主意。明白了。我同意改变数据结构。这就是我所得到的:def methodname(*arguments,&block)#请原谅这种愚蠢的格式…你明白了。顺便说一句:你可以编写
参数。注入({},:merge)
。或者只要
参数。如果您确定至少会有一个条件,则注入(:merge)
。@dfb I get syntax error,意外的tPOW,应为“')。请注意,这是RubyMoon…这可能会使事情变得有点复杂。@JamonHolmgren-我的错误。您可以执行
methodname(kwargs={},&block)
,然后以键值对进行传递。kwargs将包含作为hashI的输入,必须用methodname{name:“ABCD”,title:“yo”}调用它?我不想传入散列。我同意更改数据结构。这就是我所得到的:def methodname(*arguments,&block)#请原谅这种愚蠢的格式…你明白了。顺便说一句:你可以编写
参数。注入({},:merge)
。或者只要
参数。如果您确定至少会有一个条件,则注入(:merge)
。@dfb I get syntax error,意外的tPOW,应为“')。请注意,这是RubyMoon…这可能会使事情变得有点复杂。@JamonHolmgren-我的错误。您可以执行
methodname(kwargs={},&block)
,然后以键值对进行传递。kwargs将包含作为hashI的输入,必须用methodname{name:“ABCD”,title:“yo”}调用它?我不想通过散列。谢谢,这看起来很合理。查看其余答案,寻找最优雅的解决方案。顺便说一句:后面的逗号很容易漏掉,也许引入一个伪变量会更具可读性:
(key,value),=*arg
。我对此持怀疑态度。谢谢,这看起来很合理。查看其余答案,寻找最优雅的解决方案。顺便说一句:后面的逗号很容易漏掉,也许引入一个伪变量会更具可读性:
(key,value),=*arg
。我对此犹豫不决。谢谢,这是一个很好的答案,但重新定义方法最终是一个更好的解决方案。@JamonHolmgren:啊,从上下文来看,是的,这绝对是一个更好的答案。很高兴全部排序:)谢谢,这是一个很好的答案,但重新定义方法最终是一个更好的解决方案。@JamonHolmgren:啊,从上下文来看,是的,这绝对是一个更好的答案。很高兴一切都安排好了:)