Ruby中从哈希数组获取指定条件值时遇NoMethodError错误求助
Ruby中从哈希数组获取指定条件值时遇NoMethodError错误求助
嘿,我来帮你排查下问题根源!
你的错误出在块参数的写法上。数组里的每个元素都是完整的哈希对象,比如第一个元素是{ name: 'Ruby', is_my_favorite?: true },但你用|name, fave|两个参数接收时,Ruby会尝试把哈希解构为键值对集合,这完全不是你想要的效果——结果fave根本不是你期待的哈希对象,甚至会变成nil,自然调用fave[:is_my_favorite?]就会抛出NoMethodError了。
下面给你几种正确的实现方式,按需选择:
推荐用法:用find精准定位(高效)
find会遍历数组,返回第一个符合条件的元素,找到后就停止迭代,效率更高:
# 直接获取目标name(如果确定存在符合条件的元素) array_of_hash_objects.find { |hash| hash[:is_my_favorite?] }[:name] # 更安全的写法(处理无符合条件元素的情况) favorite_hash = array_of_hash_objects.find { |hash| hash[:is_my_favorite?] } favorite_name = favorite_hash ? favorite_hash[:name] : "没有找到偏好语言"
用collect实现你的思路
如果坚持用collect,修正块参数后可以这样写:
array_of_hash_objects.collect { |hash| hash[:name] if hash[:is_my_favorite?] }.compact.first
这里collect会生成包含目标名称和nil的数组,compact剔除nil后,first取到唯一的目标值。
用select实现
select会返回所有符合条件的哈希组成的数组,再取第一个的name:
array_of_hash_objects.select { |hash| hash[:is_my_favorite?] }.first[:name]
备注:内容来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

