检索数组中哈希的一些元素

时间:2014-06-21 19:04:47

标签: ruby sorting hash proc

我有一系列哈希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方法。怎么做?

1 个答案:

答案 0 :(得分:2)

  

我喜欢用地图(&amp; :),@ Arup Rakshit,我只是想知道为什么   那个fetch不起作用。我之间仍然没有答案。

当你写:

:fetch('product_id')

您正在告知ruby冒号后的所有内容都是您的符号名称。嗯,符号名称有一些规则,这个:

fetch('product_id')

违反了符号的语法。为什么?因为它看起来像方法调用,因此它不是有效的符号名称。如果您必须拥有该符号名称,则可以使用引号创建它:

:"fetch('product_id')"

......但当然这不是你想做的事。

接下来,&amp;做?它做了两件事:

  1. &安培;在符号上调用符号#to_proc,返回一个proc,如下所示:

    {|x| x.send(the_symbol) } #where x is an element of the array

  2. &安培;将proc转换成一个块,该块被提供给被调用的方法,例如,你的例子中的map()。