Ruby: неопределенный метод `[] 'для nil: NilClass / проблема наследования? - PullRequest
0 голосов
/ 25 сентября 2018

Не могли бы вы объяснить мне, почему я получаю эту ошибку, я думаю, это связано с тем, как я определил мою переменную экземпляра:

У меня есть родительский класс с именем 'character'

class Character
  attr_accessor :coordinates

  def initialize (coordinates)
    @coordinates = []
  end
end

И дочерний класс:

require_relative 'characters'

class Hero < Character
  attr_accessor :lives, :coordinates

  def initialize (lives, coordinates)
    @lives = lives
    @coordinates = []
  end

  def get_direction
    puts "Press up/down and left/right keys to start moving your hero"
    next_move = gets.chomp.downcase
    if next_move == 'left'
      @coordinates = [0, -1]
    elsif next_move == 'right'
      @coordinates = [0, 1]
    elsif next_move == 'up'
      @coordinates = [-1, 0]
      elif next_move == 'down'
      @coordinates = [1, 0]
    end
  end
end

Затем у меня есть main.rb, где я хочу использовать координаты @ моего персонажа и проверить, находится ли он еще на карте.Вот метод в main.rb:

def check_hero_position
    print @coordinates.class
    print @coordinates[0].class

    # @hero_location[1] += @coordinates[1]
    # case  
    # when (@hero_location[0] < 1) || (@hero_location[0] > @map_size[0]) 
    #   puts "error-x"
    # when
    #   (@hero_location[1] < 0) || (@hero_location[1] > @map_size[1])
    #   puts "error-y"
    # end
end

Когда я запускаю код, я получаю эту ошибку для строки в методе, где я пытаюсь напечатать класс координат [0].check_hero_position': undefined method [] 'для nil: NilClass

Правильно ли я использовал переменную экземпляра coordinates?Во-вторых, как я могу сравнить значения двух массивов?Я прокомментировал код в методе, так как это не правильно.

1 Ответ

0 голосов
/ 25 сентября 2018

Первым делом вы назначаете пустой массив для @coordinates при инициализации, поэтому измените его следующим образом:

class Hero < Character
  attr_accessor :lives, :coordinates

  def initialize (lives, coordinates = [])
    @lives = lives
    @coordinates = coordinates # assign the value of the parameter
  end

  def get_direction
    puts "Press up/down and left/right keys to start moving your hero"
    next_move = gets.chomp.downcase
    if next_move == 'left'
      @coordinates = [0, -1]
    elsif next_move == 'right'
      @coordinates = [0, 1]
    elsif next_move == 'up'
      @coordinates = [-1, 0]
      elif next_move == 'down'
      @coordinates = [1, 0]
    end
  end
end

Затем вам нужно создать экземпляр объекта Hero, передав параметры для инициализации:

hero = Hero.new('something', [:x,:y,:z])

И теперь вы можете вызвать метод:

p hero.coordinates #=> [:x, :y, :z]


Во второй части вопроса я могу предложить вам взглянуть на Вектор класс для перемещения и сравнения, может быть, вы можете найти полезные:
require 'matrix'

position = Vector[1, 2]
move = Vector[4, 6]

new_position = position + move #=> Vector[5, 8]
p new_position.magnitude #=> 9.433981132056603 (distance from origin 0, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...