1

私はいくつかのコードを持っています:

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

in_msg.updateCommentsハッシュです。何らかの理由で、このスニペットがエラーを返した場合の最初の行:

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

なぜこれが起こるのかわかりません。なぜそれが起こるのか、そしてそれを修正する方法はありますか?

4

3 に答える 3

9

このmapメソッドは、を返しますEnumerator。これは、ハッシュ内の各キーと値のペアをループしますが、ハッシュではなく配列を生成するため、の代わりにのcようになります。[key, value]{key => value}

Arrayは実装されていないためvalues、エラーが発生します。

于 2012-05-18T19:11:16.733 に答える
1

updateCommentsハッシュと配列のみが含まれている場合、これは機能する可能性があります。

in_msg.updateComments.map do |c|
  if c.respond_to?(:values)
    c.values
  else
    c
  end
end.each do |comment|
  ...
end
于 2012-05-18T19:06:58.550 に答える
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問題ない場合。

于 2012-05-18T19:07:29.693 に答える