我的ruby脚本中的错误

时间:2015-02-24 03:54:32

标签: ruby

我收到一个我不明白的错误。它按照我的意图运行,但最后会抛出错误。我仍然是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>'

可以提供更好的方法来做到这一点,但我也想了解为什么我会收到此错误

2 个答案:

答案 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)

i24时,nums[i]nil,您正在呼叫[]