Ruby 未定义方法“[]”为 nil:NilClass (NoMethodError)
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21821678/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Ruby undefined method `[]' for nil:NilClass (NoMethodError)
提问by steamingramen
I'm trying to make a version of Conway's game of life using ruby. I've created a Grid class with @play_area as an instance variable. However, when I run my code, @play_area turns up nil after it had already been evaluated twice (when evaluated in the line if @play_area[x_mod][y_mod].alive ). Why is this happening?
我正在尝试使用 ruby 制作康威生活游戏的一个版本。我已经用@play_area 作为实例变量创建了一个 Grid 类。然而,当我运行我的代码时,@play_area 在它已经被评估两次之后变成 nil (当在 @play_area[x_mod][y_mod].alive 行中评估时)。为什么会这样?
EDIT
编辑
Here's the initialize function:
这是初始化函数:
def initialize(sizex, sizey)
@x_length = sizex
@y_length = sizey
@play_area = []
#initialize dead cells
@x_length.times do |x|
@play_area[x] ||= []
@y_length.times do |y|
@play_area[x][y] = Cell.new(x, y, false)
puts @play_area[x][y].inspect
end
end
end
Here's the function the error occurs in:
这是发生错误的函数:
def neighbor_num_of_cell(pos_x,pos_y)
c = @play_area[pos_x][pos_y]
count = 0
((pos_x-1)..(pos_x+1)).each do |x|
((pos_y-1)..(pos_y+1)).each do |y|
unless @play_area[x][y].eql?(c)
x_mod = x % (@x_length + 1)
y_mod = y % (@y_length + 1)
puts x_mod
puts y_mod
if @play_area[x_mod][y_mod].alive
count += 1
end
end
end
end
count
end
The inspect on each of the cells in @play_area shows that each one of the cells is initialized correctly, here is the output of the inspect:
@play_area 中每个单元格的检查显示每个单元格都正确初始化,这是检查的输出:
jon@jon-MacBook:~/programs/ruby$ ruby main.rb
#<Cell:0x00000000f919d8 @alive=false, @alive_next=false, @x_pos=0, @y_pos=0>
#<Cell:0x00000000f91848 @alive=false, @alive_next=false, @x_pos=0, @y_pos=1>
#<Cell:0x00000000f916e0 @alive=false, @alive_next=false, @x_pos=0, @y_pos=2>
#<Cell:0x00000000f915a0 @alive=false, @alive_next=false, @x_pos=0, @y_pos=3>
#<Cell:0x00000000f91460 @alive=false, @alive_next=false, @x_pos=0, @y_pos=4>
#<Cell:0x00000000f91320 @alive=false, @alive_next=false, @x_pos=0, @y_pos=5>
#<Cell:0x00000000f911e0 @alive=false, @alive_next=false, @x_pos=0, @y_pos=6>
#<Cell:0x00000000f910a0 @alive=false, @alive_next=false, @x_pos=0, @y_pos=7>
#<Cell:0x00000000f90f38 @alive=false, @alive_next=false, @x_pos=0, @y_pos=8>
...
...
#<Cell:0x00000000f1abf8 @alive=false, @alive_next=false, @x_pos=19, @y_pos=7>
#<Cell:0x00000000f1aa90 @alive=false, @alive_next=false, @x_pos=19, @y_pos=8>
#<Cell:0x00000000f1a900 @alive=false, @alive_next=false, @x_pos=19, @y_pos=9>
#<Cell:0x00000000f1a798 @alive=false, @alive_next=false, @x_pos=19, @y_pos=10>
#<Cell:0x00000000f1a658 @alive=false, @alive_next=false, @x_pos=19, @y_pos=11>
#<Cell:0x00000000f1a518 @alive=false, @alive_next=false, @x_pos=19, @y_pos=12>
#<Cell:0x00000000f1a3b0 @alive=false, @alive_next=false, @x_pos=19, @y_pos=13>
#<Cell:0x00000000f1a270 @alive=false, @alive_next=false, @x_pos=19, @y_pos=14>
#<Cell:0x00000000f1a130 @alive=false, @alive_next=false, @x_pos=19, @y_pos=15>
#<Cell:0x00000000f19ff0 @alive=false, @alive_next=false, @x_pos=19, @y_pos=16>
#<Cell:0x00000000f19e88 @alive=false, @alive_next=false, @x_pos=19, @y_pos=17>
#<Cell:0x00000000f19d20 @alive=false, @alive_next=false, @x_pos=19, @y_pos=18>
#<Cell:0x00000000f19be0 @alive=false, @alive_next=false, @x_pos=19, @y_pos=19>
采纳答案by meagar
The problem is with this line:
问题出在这一行:
@play_area[x][y] = Cell.new(x, y, false)
@play_area[x]is nil. You've only initialized one dimension of your multidimensional array. You need to initialize each element of @play_area[x]to an array before trying to add an element to it.
@play_area[x]为零。您只初始化了多维数组的一维。@play_area[x]在尝试向数组添加元素之前,您需要将 的每个元素初始化为数组。
@x_length.times do |x|
@play_area[x] ||= []
@y_length.times do |y|
@play_area[x][y] = Cell.new(x, y, false)
end
end
回答by kiradess
I've run into this problem myself before. Your problem comes from trying to check cells that don't exist. Think for a second how this function evaluates the cells surrounding cell (0,0). First it's going to look at the contents of cell (-1, -1)... Which is Nil. We're lucky to even get Nil using Ruby; in Python this would raise a 'list index out of range' exception.
我自己以前也遇到过这个问题。您的问题来自尝试检查不存在的单元格。想一想这个函数如何评估单元格 (0,0) 周围的单元格。首先它会查看单元格 (-1, -1) 的内容......这是 Nil。我们很幸运,甚至使用 Ruby 获得了 Nil;在 Python 中,这会引发“列表索引超出范围”异常。

