Изучите Руби Хардвэй экс. 42. 2 занятия в 2 файлах

Я понимаю, как работают классы и как их делать, но второй дополнительный балл упражнения говорит о создании двухклассовой версии в 2 разных файлах.

Я пробовал разные вещи, но я не могу понять, как заставить это работать...

Я не знаю, ищу ли я в нужных местах, но я не могу найти ни помощи, ни решения...

Если бы кто-нибудь мог помочь мне в этом, это было бы очень ценно:)

Вот упражнение: http://ruby.learncodethehardway.org/book/ex42.html

Что я уже пробовал:

map.rb
class Map

with all the methods in here (death(), central_corridor(), etc.)

затем

engine.rb
class Engine
require './map.rb'

  def initialize(start)
    @quips = [
      "You died. You kinda suck at this.",
      "Nice job, you died... jackass.",
      "Suck a luser."
    ]

    @start = start
    puts "in init @start = " + @start.inspect
  end

  def prompt()
    print "> "
  end

  def play()
    puts "@start => " + @start.inspect
    @next_room = @start

    while true
      puts "\n--------"
      room = method(@next_room)
      @next_room = room.call()
    end
  end

end

a_game = Engine.new(:central_corridor)
a_game.play()

Итак, в основном я получил методы, используемые для "действий" в игре (комнаты, смерть и т. Д.), И поместил их в класс Map в map.rb, а затем вызвал в engine.rb, где у меня есть мой класс. Движок с "общими" методами / переменными, такими как prompt, play, start.

Я получаю ошибку

engine.rb:24:in `method': undefined method `central_corridor' for class `Engine'

Я понимаю, что это означает, что ruby ​​пытается найти метод "central_corridor" в движке классов, но он находится в карте классов в map.rb, и я не могу понять, что делать, это либо некоторые изменения переменных, либо просто некоторые вещи, которые нужно добавить...:(

1 ответ

Решение

Проблема в том, что у вас нет экземпляра класса Map, что вам нужно, чтобы иметь возможность позвонить central_corridor, Добавьте это в initialize:

@map=Map.new

И изменить room = method(@next_room) в room=@map.method(@next_room),


Хотя это не ваш вопрос, у меня есть ощущение, что если Map никогда не изменяется (у вас есть методы для всего на карте), что вы делаете все методы класса методов и просто используете класс Map для вашей карты. Но по хорошим принципам дизайна, вы, вероятно, должны сделать карту Hash лямбды, представляющие области. Таким образом, вы можете иметь более одной карты

Другие вопросы по тегам