为什么在尝试循环哈希时会出现未定义的方法错误?

时间:2012-05-18 18:55:04

标签: ruby-on-rails ruby

我有一些代码:

  in_msg.updateComments.map{|c| c.values}.each do |comment|
    ...
  end

其中in_msg.updateComments是哈希值。出于某种原因,如果此代码段返回错误,则第一行:

NoMethodError: undefined method `values' for #<Array:0x1382da058>

我不确定为什么会这样。知道为什么会发生这种情况以及如何解决它?

3 个答案:

答案 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.eacha_hash.each就可以了。