web-dev-qa-db-ja.com

Ruby:ハッシュの配列で列挙子を取得しようとすると、nil:NilClassの未定義メソッド「[]」

ハッシュの配列でループしようとしています。列挙子をフェッチしてループを開始するポイントに達すると、次のエラーが発生します。

undefined method `[]' for nil:NilClass

私のコードは次のようになります。

def extraireAttributs (attributsParam)
  classeTrouvee = false
  scanTrouve = false
  ownerOSTrouve = false
  ownerAppTrouve = false
  resultat = Hash.new(0)
  attributs = Array(attributsParam)

  attributs.each do |attribut| #CRASHES HERE!!!
    typeAttribut = attribut['objectTypeAttribute']
    [...]

attributsParamsargumentとattributsvariableがnilまたは空でないことを確認するために、デバッグモードでチェックしました。両方(同じであるため)には59個のハッシュオブジェクトが含まれていますが、配列の列挙子を取得できません。

なぜこのエラーが発生し続けるのですか?

ありがとう!

5
Joe Toug

_undefined method `[]' for nil:NilClass_は、_something[index]_を実行しようとしたが、somethingnilであると言います。 Rubyでは、nilを配列として使用できません(つまり、_[]_メソッドを呼び出します)。

問題は_attributs.each_行ではなく、attributで_[]_メソッドを呼び出す次の行にあります。

_typeAttribut = attribut['objectTypeAttribute']
_

これは、attributsの値がnilであることを示しています。これは、attributsParamがnilを含むリストである場合に発生する可能性があります。

_attributsParam = [nil];
attributs = Array(attributsParam);

# [nil]
puts attributs.inspect
_

デバッグする最も簡単な方法は、ループの直前に_puts attributs.inspect_を追加することです。

また、本当にattributs = Array(attributsParam)行が必要かどうか、または既に何か Enumerable であるかどうかも考慮してください。

10
Schwern