2017-01-06 5 views
0

ハッシュの配列をループしようとしています。私はループを開始する列挙子を取得ポイントに到達すると、私は次のエラーを取得する:Ruby:未定義メソッド `[] 'for 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'] 
    [...] 

私が確認するために、デバッグモードで確認attributsParams引数とattributs変数がnilまたは空ではありません。両方とも(同じものなので!)59個のハッシュオブジェクトが含まれていますが、配列には列挙子がありません。

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

ありがとうございます!

+0

次の行は表示されていませんか? – Schwern

+0

それは後のコードではないと確信していますか?行番号なしで知ることは難しいですが、行番号を提供できますか? – Schwern

+0

'attributsparam'はどのように見えますか?ハッシュが多すぎる場合は、そのうち3つを表示してください! –

答えて

1

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と考えてください。

+1

あなたは正しいです。外側の配列の内側にあるハッシュの内部構造が変更されました。したがって、ループ内で例外が発生しました。どうもありがとう! –

関連する問題