当前位置: 首页 > 知识库问答 >
问题:

用于nil的Ruby未定义方法'[]':NilClass(NoMachodError)

宇文鸣
2023-03-14

我想用ruby制作一个康威的生活游戏版本。我创建了一个网格类,其中@play\u area作为实例变量。然而,当我运行代码时,@play\u area在经过两次求值后显示为nil(当在行中求值时,如果@play\u area[x\u mod][y\u mod].alive)。为什么会这样?

编辑

以下是初始化函数:

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

以下是发生错误的函数:

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

对@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>

共有2个答案

刘德义
2023-03-14

我以前也遇到过这个问题。你的问题来自于试图检查不存在的细胞。请思考一下此函数如何计算单元格(0,0)周围的单元格。首先看一下单元格(-1,-1)的内容。。。这是零。我们很幸运,使用Ruby甚至可以得到零;在Python中,这会引发“列表索引超出范围”异常。

黎承颜
2023-03-14

问题在于这一行:

@play_area[x][y] = Cell.new(x, y, false)

@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
 类似资料:
  • 我正在学习Ruby,我有一个无法理解的bug。我有一个方法,它接受一个字符串(行)数组,并删除所有行,直到包含模式的某一行。该方法如下所示: 这工作正常,生成的字符串(行)正确显示在我正在生成的网页上。 此外,我想删除该模式后面的所有非空行。我修改了方法如下: 令人惊讶的是(至少对我来说)这不起作用。在生成的网页上,我看到的不是内容,而是错误消息:Liquid error:nil类的未定义方法“[

  • Rails关联的基本问题如下表: 商店:名称,网络 产品:标题、价格、店铺id 关系定义为has_many并属于: 型号: shop.rb 产品rb型 控制器: shops\u控制器。rb型 products_controller.rb 在商店视图中,我设法参考并显示每个商店的所有产品,没有问题: 但另一方面,在产品视图中,我无法从Shop表中显示网络信息: 这将返回以下错误:

  • 我用最新的Mac OS版本M1在MacBook Air上运行可可豆。我的问题是:当我运行时,我会得到以下输出(我会删除一点,因为其他方式会很长): nil的未定义方法“map”:NilClass 完全错误: LoadError-dlopen(/Library/Ruby/Gems/2.6.0/Gems/ffi-1.15.0/lib/ffi_c.bundle,9):未找到合适的图像。确实找到了:/Li

  • 我有一个非常基本的应用程序,由商店和属于商店的产品组成。我从产品表单中很好地提取了store ID,但每次尝试在产品视图中显示store中的属性时,都会出现未定义的方法错误。 products\u控制器。rb型 product.rb 产品表单(_form.html.erb) store.rb 以及有问题的产品视图(nil: NilClass的未定义方法“名称”): 使用Rails控制台查找属于我引

  • 超过3个小时,我试图解决相当容易的错误(第一眼): 但还是没有成功。 我有DB表products,其中包含列category\u id和manufacturer\u id。 协会: 试图获取一些数据: 我获取了所有行,其中在列