Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 检索数组中哈希的某些元素_Ruby_Sorting_Hash_Proc - Fatal编程技术网

Ruby 检索数组中哈希的某些元素

Ruby 检索数组中哈希的某些元素,ruby,sorting,hash,proc,Ruby,Sorting,Hash,Proc,我有一个哈希数组myhash: myhash => [{"product_id"=>"1", "test"=>"2", "retest"=>"42"}, {"product_id"=>"1", "test"=>"2", "retest"=>"42"}] 我想将散列映射到product\u id的值。我这样做: myhash.map{|item| item['product_id']} # => ["1", "1"] 这就是我想要的 是否有任何方

我有一个哈希数组
myhash

myhash
=> [{"product_id"=>"1", "test"=>"2", "retest"=>"42"}, {"product_id"=>"1", "test"=>"2", "retest"=>"42"}]
我想将散列映射到
product\u id
的值。我这样做:

myhash.map{|item| item['product_id']}
# => ["1", "1"]
这就是我想要的

是否有任何方法可以使用map proc使它变得更好?我尝试了
myhash.map(&:fetch('product\u 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>'
它检索好的值。问题是,在使用映射时,我不能将参数传递给
fetch
方法。如何做到这一点

我喜欢在可能的时候使用map(&:),我只是想知道为什么 那次抓取不起作用。我仍然没有答案

当你写作时:

:fetch('product_id')
您正在通知ruby冒号后面的所有内容都是符号的名称。符号名有一些规则,这是:

fetch('product_id')
违反符号的语法。为什么?因为它看起来像一个方法调用,因此它不是一个有效的符号名。如果必须使用该符号名,可以使用引号创建:

:"fetch('product_id')"
…但这当然不是你想要做的

接下来,我们做什么?它做两件事:

  • &对符号调用Symbol#to _proc,返回一个proc,如下所示:

    {| x | x.send(u符号)}其中x是数组的元素

  • &将过程转换为提供给被调用方法的块,例如示例中的map()


  • 没有内置的。。创建您自己的进程对象。。。看看如何构建……无论如何,谢谢你,所以我想我写的第一个可行的解决方案是最简单、最干净的?当然你的解决方案也是最快、最干净的……无意冒犯,我喜欢在可能的时候使用map(&:)@Arup Rakshit,我只是想知道为什么这个获取不起作用。我仍然没有答案。@sawa,对不起,这是我的irb测试的剩余部分,我编辑了我的问题。感谢您的善意解释,在本例中,
    x
    是数组的元素,因此它是散列
    fetch
    是一个散列方法()我错过了什么吗?@sidney,你告诉ruby有一个名为
    fetch('product\u id')
    的方法。该方法名包含19个字符。请发布一个链接,显示哈希的方法名称,该名称以“f”开头,有19个字符。因此,我可以调用
    fetch
    ,但我不能将任何参数传递给此方法?@sidney,您不能将参数传递给进程,因为它正被转换为一个block by&for the map()方法,这意味着map()是将参数传递给块的东西…而map()只传递一个参数。然而,还有其他一些方法可以将多个参数传递给块,例如inject(),但这会导致大量蠕虫,因为Rails#Symbol#to#u proc的实现方式不同于Ruby#Symbol#to#u proc。查看Ruby#Symbol#to_proc的C源代码,我不相信您可以传递多个参数,@sidney,如果您查看第三方库ampex:,它添加了在使用&时传递参数的功能,其中一个示例正是您想要做的。
    :"fetch('product_id')"