【问题标题】:Retrieve some elements of a hash inside an array检索数组中散列的一些元素
【发布时间】:2014-06-21 19:04:46
【问题描述】:

我有一个哈希数组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 方法。该怎么做?

【问题讨论】:

  • 没有内置的..创建你自己的proc对象...查看this answer以了解如何构建..
  • 还是谢谢你,所以我想我写的第一个可行的解决方案是最简单和更干净的?
  • 当然你的也是最快和干净的..
  • 无意冒犯,我喜欢尽可能使用 map(&:),@Arup Rakshit,我只是想知道为什么那个 fetch 不起作用。我仍然没有答案。
  • @sawa,对不起,这是我的 irb 测试的剩余部分,我编辑了我的问题。

标签: ruby sorting hash proc


【解决方案1】:

我喜欢尽可能使用 map(&:),@Arup Rakshit,我只是想知道为什么 那个提取没有用。我仍然没有答案。

当你写作时:

:fetch('product_id')

你是在告诉 ruby​​,冒号后面的所有内容都是你的符号名称。好吧,符号名称有一定的规则,这是:

fetch('product_id')

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

:"fetch('product_id')"

...当然这不是你想要做的。

接下来,& 做什么?它做了两件事:

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

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

  2. & 将 proc 变成一个块,提供给被调用的方法,例如map() 在您的示例中。

【讨论】:

  • 感谢您的友好解释,在这种情况下,x 是数组的元素,因此它是一个哈希。 fetch 是一种哈希方法(ruby-doc.org/core-2.1.2/Hash.html#method-i-fetch)我错过了什么吗?
  • @sidney,你告诉 ruby​​ 有一个名为 fetch('product_id') 的方法。该方法名称有 19 个字符。请发布一个链接,显示以“f”开头并包含 19 个字符的 Hash 方法名称。
  • 所以,我可以调用fetch,但我不能将任何参数传递给这个方法?
  • @sidney, You 无法将参数传递给 proc,因为它正在被 & 转换为 map() 方法的块,所以这意味着 map() 是将参数传递给块的东西......并且 map() 只传递一个参数。但是,还有其他方法可以将多个参数传递给块,例如注入(),但这会打开一罐蠕虫,因为 Rails#Symbol#to_proc 的实现方式与 Ruby#Symbol#to_proc 不同。查看 Ruby#Symbol#to_proc 的 C 源代码,我不相信您可以传递多个参数,...
  • @sidney,如果您查看第 3 方库 ampex:cirw.in/blog/ampex,它增加了在使用 & 时传递参数的能力,其中一个示例完全符合您的要求。
猜你喜欢
  • 1970-01-01
  • 2011-01-15
  • 2012-03-26
  • 2020-12-13
  • 1970-01-01
  • 2015-07-01
  • 2012-03-28
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多