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:啊,从上下文来看,是的,这绝对是一个更好的答案。很高兴一切都安排好了:)