Использует ли массив как метод?

2 dwilbank [2014-03-07 02:35:00]

У меня этот класс:

class Game
  attr_accessor :player_fleet, :opponent_fleet
  @player_fleet = []
  @opponent_fleet = []
  ...
end

и создайте такой экземпляр:

my_game = Game.new

затем используйте его следующим образом:

my_game.opponent_fleet << opponent

который дает мне эту ошибку:

undefined method '<<' for nil:NilClass (NoMethodError)

Почему я не могу обработать такой массив? Должен ли я создавать метод для перемещения объектов в массив?

ruby


1 ответ


4 Решение Niklas B. [2014-03-07 02:37:00]

Вы инициализируете @opponent_fleet на уровне класса, поэтому это переменная экземпляра класса, а не созданных объектов. Помните, что в Ruby даже классы являются объектами :)

irb(main):001:0> class Game
irb(main):002:1>   @foo = 3
irb(main):003:1> end
irb(main):004:0> Game.instance_eval { @foo }
=> 3
irb(main):005:0> Game.new.instance_eval { @foo }
=> nil

Вместо этого вы хотите инициализировать его в конструкторе:

class Game
  attr_accessor :player_fleet, :opponent_fleet

  def initialize
    @player_fleet = []
    @opponent_fleet = []
  end
end