2015-02-24 33 views
0

我收到一個錯誤,我不明白。它運行我的意圖,但最後拋出一個錯誤。我對Ruby仍然陌生,但我知道它與我的循環有關。我的紅寶石腳本中的錯誤

這是我的代碼

nums = Array.new(24){Array.new(80){'X'}} 
system('cls') 
for i in 0..24 
    for j in 0..79 
      print nums[i][j] 
    end 
end 

這是錯誤消息

K:/Ruby 2/RubyInvaders.rb:5:in block (2 levels) in <main>': undefined method `[]' for nil:NilClass (NoMethodError) 
from K:/Ruby 2/RubyInvaders.rb:4:in each' 
from K:/Ruby 2/RubyInvaders.rb:4:in block in <main>' 
from K:/Ruby 2/RubyInvaders.rb:3:in each' 
from K:/Ruby 2/RubyInvaders.rb:3:in <main>' 

其確定提供更好的方法來做到這一點,但我也想知道爲什麼我收到此錯誤

回答

3

您正在創建一個有24個元素的數組,然後是一個有25次迭代的循環。當您嘗試打印該循環的第25次迭代時,數組的位置不存在。如果更改for i in 0..24for i in 0..23,其誤差應加以解決:

nums = Array.new(24){Array.new(80){'X'}} 
system('cls') 
for i in 0..23 
    for j in 0..79 
    print nums[i][j] 
    end 
end 

要放大喬恩的評論,與...運營商創造了紅寶石範圍內是唯一的,不會使用最高的規定值(而不是在..包括在內)。

而 - 雖然你的循環方法是有效的 - 它不是ruby的慣用語。像這樣的東西會比較常見:

nums = Array.new(24){Array.new(80){'X'}} 
system('cls') 
(0..23).each do |i| 
    (0..79).each do |j| 
    print nums[i][j] 
    end 
end 
+0

我明白了。我一直在直視這個問題,但一直在尋找for循環,並且從未檢查過我的原始聲明。 – 2015-02-24 04:23:04

+1

你也可以使用'0 ... 24'和'0 ... 80',這有點容易理解。 – Jon 2015-02-24 04:23:10

+0

「正在創建」=>「正在創建」,「與」>「的」>「,然後創建」=>「創建」 – sawa 2015-02-24 04:23:24

3

i24nums[i]nil,您在調用它[]