我收到一个我不明白的错误。它按照我的意图运行,但最后会抛出错误。我仍然是ruby的新手,但我知道它与我的for循环有关。
这是我的代码
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>'
可以提供更好的方法来做到这一点,但我也想了解为什么我会收到此错误
答案 0 :(得分:3)
您正在创建一个包含24个元素的数组,然后创建一个包含25次迭代的循环。当您尝试打印该循环的第25次迭代时,阵列位置不存在。如果您将for i in 0..24
更改为for 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
要放大Jon的评论,使用...
运算符创建的ruby范围是独占的,并且不会使用最高指定值(而不是..
运算符,包容性)。
而且 - 虽然你的循环方法是有效的 - 但它对于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
答案 1 :(得分:3)
当i
为24
时,nums[i]
为nil
,您正在呼叫[]
。