2012-06-21 18 views
2

我瞭解班級是如何工作的,以及如何製作班級,但第二個額外功勞表示要在兩個不同檔案中創建兩個班級的班級。學習Ruby the Hardway前。 42. 2個檔案中的2個班級

我嘗試不同的東西,但我無法弄清楚如何使它工作...

我不知道如果我沒有在正確的地方尋找,但我無法找到對任何幫助,也沒有找到任何解決辦法...

如果有人可以幫助我上,那將是非常讚賞:)

這裏是exercice: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() 

所以基本上我所做的就是用於遊戲中的「動作」(房間,死亡等方法..並把他們在地圖類地圖。 rb,然後在engine.rb中調用,其中我有我的類引擎與「一般」方法/變量,如提示,播放,啓動。

我得到的錯誤是

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

我明白它的意思紅寶石試圖找到在類發動機的方法「central_corridor」,但它是在類圖中map.rb我想不通出了什麼做,要麼是一些可變的修改或只是一些東西要添加... :(

+1

你可以[編輯]你的文章,包括你試過的東西以及你從嘗試中得到的錯誤消息嗎? – sarnold

+0

不要在引擎類中'需要'映射類*,而是在類聲明之前。但是'Engine'實例方法(通過'Engine'聲明中的'def'定義)需要執行一個'Engine'的實例。 –

+0

你是什麼意思需要一個引擎的實例來執行?在2個文件中有2個類的練習的全部重點是在引擎中使用一個地圖的實例,我認爲... – Jauny

回答

2

問題是,你沒有類Map,這是你需要能夠打電話的實例central_corridor。將此添加到initialize

@map=Map.new 

並將room = method(@next_room)更改爲[email protected](@next_room)


雖然這isen't你的問題,我有一種感覺,如果Map不會改變(你在地圖上的一切方法),你讓所有的方法類方法,只是使用類Map爲您的地圖。但是,通過良好的設計原則,您應該可以讓地圖具有代表區域的lambda表達式的Hash。這樣,你可以有多個地圖

+0

非常感謝,問題解決了! 但現在我有另一個問題,這是相反的:) /Users/Jonathan/Hardway/map.rb:20:in'central_corridor':未定義的方法'提示'爲#<地圖:0x007fb928846e88>(NoMethodError) 非常感謝 – Jauny

+0

@Jauny:很高興幫助。當您找到解決問題的答案時,您可以點擊投票計數下的檢查以接受答案。 – Linuxios

+0

@Jauny:Map.central_corridor方法的返回值是什麼?它是否每次都返回':prompt'? – Linuxios