2016-06-18 9 views
0

forループには、配列に格納された多数のハッシュが表示されますが、:featuresキーに関連付けられたハッシュのみが表示されます。Ruby - forループのランタイムエラー

私はideone.comでコードを実行しようとしましたが、forループはうまく動作し、私の出力をプリントアウトしますが、最初の行にはエラーが表示されます。

#output 
Runtime error time: 0.06 memory: 9712 signal:-1 
[0.25, 0.1, 5] 
[0.3, 0.14, 7] 
[0.2, 0.17, 6] 
[0.4, 0.12, 8] 
[0.1, 0.11, 3] 

そして、ここではあなたがstderr出力を見るのを忘れ

data_point_a = {:label => "cat", :features => [0.25,0.1,5]} 
data_point_b = {:label => "dog", :features => [0.3,0.14,7]} 
data_point_c = {:label => "dog", :features => [0.2,0.17,6]} 
data_point_d = {:label => "dog", :features => [0.4,0.12,8]} 
data_point_e = {:label => "cat", :features => [0.1,0.11,3]} 
data_point_f = {:label => "unknown", :features => [0.8,0.3,4]} 
#data point f is not part of the array 
list = [data_point_a, data_point_b,data_point_c,data_point_d,data_point_e] 

for index in 0..list.length 
    puts "#{list[index][:features]}" 
end 
+0

あなたの質問は何ですか? – sawa

+0

私はこのエラーが実際にはideone.comで動作しているのではなく、ルビーコード自体ではないと思いますか? – rogerkk

答えて

3

私のコードです:

prog.rb:11:in `block in <main>': undefined method `[]' for nil:NilClass (NoMethodError) 
    from prog.rb:10:in `each' 
    from prog.rb:10:in `<main>' 

問題は、あなたのループが0からlist.lengthに実行されることですが、最後の有効listのインデックスはlist.length - 1です。これは動作するはずです。これを行うには

for index in 0..(list.length - 1) 
    puts "#{list[index][:features]}" 
end 

より多くの慣用的な方法を.eachを使用することです:

list.each do |item| 
    puts "#{item[:features]}" 
end 
+0

'#each 'を使うのは良い選択です。最後にRubyで 'for'ループを使用したときは覚えていません。 – rogerkk

2

私が代わりに入れているため(..)のそれは(...)になると思います。 ...に

for index in 0...list.length 
    puts "#{list[index][:features]}" 
end 
0
(0..3).to_a  #=> [0,1,2,3] 
(0...3).to_a #=> [0,1,2] 

最終index nilを実際に最後のインデックスを除外します210ループが範囲外です。