Ruby attr_accessor не читается - PullRequest
       29

Ruby attr_accessor не читается

0 голосов
/ 21 декабря 2011

Я разрабатываю игру с Ruby, используя драгоценные камни Gosu и Chipmunk. У меня есть следующий класс в файле с именем HeroBullets.rb:

require 'gosu'

class HeroBullets
  attr_accessor :y
  def initialize(window)
    @x = 20
    @y = 0
  end
end

Я знаю, что нужен доступ к этому классу из другого файла, Physics.rb, который обрабатывает весь код Chipmunk.

Вверху у меня есть:

require 'chipmunk'

load 'HeroBullets.rb'

class Physics
   attr_accessor :play_area 

def initialize(window)

    @hBullets = Array.new(25)
    @hBullets << HeroBullets.new(window)
    @hBullets << HeroBullets.new(window)
end

А дальше внизу:

  def fire_arrow(y)
    for i in 0...@hBullets.count
      @bullet = @hBullets[i]
      if(@bullet.y == y)
        @hBullets[i].active = true
      end
    end
  end

Ошибка, которую я получаю:

Physics.rb:112:in block in fire_arrow': undefined methody' for nil:NilClass 
(NoMethodError) from Physics.rb:110:in each' from Physics.rb:110:infire_arrow'
from FileManager.rb:90:in fireHero' from .../lib/main.rb:90:inupdate' from .../lib/main.rb:129:in `'

1 Ответ

3 голосов
/ 21 декабря 2011

Проблема в том, что если @hBullets имеет 10 элементов, @hBullets.count будет выводить 10, но @hBullets[10] не будет работать, поскольку индекс массива начинается с 0, а не с 1.Десятый элемент будет в @hBullets[9].Вы получаете сообщение об ошибке, потому что элемент, к которому вы пытаетесь обратиться, - nil, а не потому, что «attr_accessor не читается».

При этом Ruby предлагает гораздо более простые способы итерации по массиву.Я бы переписал ваш код следующим образом:

def fire_arrow(y)
  @hBullets.each do |bullet|
    bullet.active = true if bullet.y == y
  end
end

Другая проблема с вашим кодом заключается в том, что вы инициализируете новый массив следующим образом:

@hBullets = Array.new(25)

Это создает массив с 25 элементами, которыевсе nil.Вместо этого вы должны начать с пустого массива:

@hBullets = Array.new

Или:

@hBullets = []
...