我有一系列哈希myhash
:
myhash
=> [{"product_id"=>"1", "test"=>"2", "retest"=>"42"}, {"product_id"=>"1", "test"=>"2", "retest"=>"42"}]
我想将哈希值映射到product_id
的值。我这样做了:
myhash.map{|item| item['product_id']}
# => ["1", "1"]
给出了我想要的东西。
无论如何使用map proc更好吗?我试过myhash.map(&:fetch('product_id'))
,但无济于事。
编辑:换句话说,由于@ 7stud试图回答,我恢复了这种情况:
a.map(&:"fetch('product_id')")
=> NoMethodError: undefined method `fetch('product_id')' for {"product_id"=>"1", "test"=>"2", "retest"=>"42"}:Hash
from (irb):5:in `map'
from (irb):5
from /home/shideneyu/.rbenv/versions/1.9.3-p194/bin/irb:12:in `<main>'
或者,当我这样做时:
{"product_id"=>"1", "test"=>"2", "retest"=>"42"}.fetch('product_id')
=> "1"
它检索好的价值。那么问题是我在使用地图时无法将参数传递给fetch
方法。怎么做?
答案 0 :(得分:2)
我喜欢用地图(&amp; :),@ Arup Rakshit,我只是想知道为什么 那个fetch不起作用。我之间仍然没有答案。
当你写:
:fetch('product_id')
您正在告知ruby冒号后的所有内容都是您的符号名称。嗯,符号名称有一些规则,这个:
fetch('product_id')
违反了符号的语法。为什么?因为它看起来像方法调用,因此它不是有效的符号名称。如果您必须拥有该符号名称,则可以使用引号创建它:
:"fetch('product_id')"
......但当然这不是你想做的事。
接下来,&amp;做?它做了两件事:
&安培;在符号上调用符号#to_proc,返回一个proc,如下所示:
{|x| x.send(the_symbol) } #where x is an element of the array
&安培;将proc转换成一个块,该块被提供给被调用的方法,例如,你的例子中的map()。