我有一些代码:
in_msg.updateComments.map{|c| c.values}.each do |comment|
...
end
in_msg.updateComments
哈希在哪里。出于某种原因,如果此代码段返回错误的第一行:
NoMethodError: undefined method `values' for #<Array:0x1382da058>
我不确定为什么会这样。知道为什么会发生以及如何解决吗?
我有一些代码:
in_msg.updateComments.map{|c| c.values}.each do |comment|
...
end
in_msg.updateComments
哈希在哪里。出于某种原因,如果此代码段返回错误的第一行:
NoMethodError: undefined method `values' for #<Array:0x1382da058>
我不确定为什么会这样。知道为什么会发生以及如何解决吗?
该map
方法返回一个Enumerator
,它将遍历散列中的每个键值对,但它产生一个数组,而不是散列,因此c
看起来像[key, value]
而不是{key => value}
.
Array
没有实现values
,这就是您收到错误的原因。
这可以工作,只要updateComments
包含哈希和数组:
in_msg.updateComments.map do |c|
if c.respond_to?(:values)
c.values
else
c
end
end.each do |comment|
...
end
产生的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
会很好。