Изучите Руби Хардвэй экс. 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
лямбды, представляющие области. Таким образом, вы можете иметь более одной карты