将 Enumerable 转换为 Hash 的 Ruby 库函数
考虑 Enumerable 的这个扩展:
module Enumerable
def hash_on
h = {}
each do |e|
h[yield(e)] = e
end
h
end
end
它的使用方式如下:
people = [
{:name=>'fred', :age=>32},
{:name=>'barney', :age=>42},
]
people_hash = people.hash_on { |person| person[:name] }
p people_hash['fred'] # => {:age=>32, :name=>"fred"}
p people_hash['barney'] # => {:age=>42, :name=>"barney"}
是否有一个内置函数已经执行此操作,或者足够接近它以至于不需要此扩展?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
Enumerable.to_h 接受
[key, value]
或用于将元素转换为Hash
的块,因此您可以执行以下操作:该块应返回一个 2 元素数组,该数组将成为返回
哈希
。如果您有多个值映射到同一个键,则保留最后一个值。在 Ruby 3 之前的版本中,您需要先使用
map
进行转换,然后再调用to_h
:Enumerable.to_h accepts either a sequence of
[key, value]
s or a block for converting elements into aHash
so you can do:The block should return a 2-element array which becomes a key-value pair in the returned
Hash
. If you have multiple values mapped to the same key, this keeps the last one.In versions of Ruby earlier than 3, you'll need to convert with
map
first before callingto_h
:键采用数组形式,可以有多个 Freds 或 Barneys,但如果您确实需要,可以使用 .map 来重建。
Keys are in form of arrays to have a possibility to have a several Freds or Barneys, but you can use
.map
to reconstruct if you really need.