我有一些代码:
in_msg.updateComments.map{|c| c.values}.each do |comment|
...
end
其中in_msg.updateComments
是哈希值。出于某种原因,如果此代码段返回错误,则第一行:
NoMethodError: undefined method `values' for #<Array:0x1382da058>
我不确定为什么会这样。知道为什么会发生这种情况以及如何解决它?
答案 0 :(得分:9)
map
方法返回Enumerator
,它将遍历哈希中的每个键值对,但它会产生一个数组,而不是哈希值,因此c
将会显示比如[key, value]
而不是{key => value}
。
Array
未实现values
,这就是您收到错误的原因。
答案 1 :(得分:1)
如果updateComments
只包含哈希和数组,这可能有效:
in_msg.updateComments.map do |c|
if c.respond_to?(:values)
c.values
else
c
end
end.each do |comment|
...
end
答案 2 :(得分:1)
Hash#map
产生的不是散列,而是数组[key,value]
。
irb> {a:1,b:2}.map {|arg| p arg}
[:a, 1]
[:b, 2]
=> [[:a, 1], [:b, 2]]
=============
如果您想迭代哈希值,a_hash.values.each
或a_hash.each
就可以了。