2012-03-20 62 views
8

我試圖學會在ruby中創建多類程序。我編寫了一個Engine類和一些其他類,比如城市,街道等,並且在將類名稱作爲變量傳遞給其他類時遇到了問題。下面的代碼會拋出錯誤:「City.rb:15:in'intro':未定義的局部變量或方法遊戲'for#(NameError)」。我從某種意義上理解了這個問題,但我認爲這個城市不需要知道關於遊戲對象的任何信息,我認爲它只需要得到它並將其傳回。但出乎意料地,我對如何在類之間傳遞變量(特別是類名)有誤解。我的設計出了什麼問題?如何將類名作爲變量傳遞給Ruby中的另一個類

#Game.rb 
require './City.rb' 
class Engine 
    def initialize(city_name, street_name, budget) 
    @city = City.new(city_name) 
    @city.read_name() 
    play(@city, :intro, self) 
    end 

    def play(place, next_step, engine) 
    while true 
     next_step = place.method(next_step).call(place, next_step, engine) 
    end 
    end 
end 

game = Engine.new("Casablanca", "Costanza Boulvard", 200) 

#City.rb 
class City 
    def initialize(city_name) 
    @city_name = city_name 
    end 

    def read_name() 
    puts <<-READ_NAME 
    You are in a city called "#{@city_name}". 
    READ_NAME 
    end 

    def intro(place, next_step, engine) 
    puts "...." 
    game.play(@street, :enter, engine) 
    end 
end 
+0

我沒有看到你在這裏傳遞類名的地方。 – 2012-03-20 08:58:56

+0

另外,修復你的命名。應該是'city.rb'和'game.rb'(文件名--snake_case,類名--PascalCase)。 – 2012-03-20 08:59:59

+0

感謝您的提示。我試圖將game.rb#6上的類名作爲引擎傳遞給self,並將它作爲可變引擎傳遞給game.rb#9。這可能是我誤解的地方。你能給我一個關於如何將類名傳遞給另一個類的可靠例子,完全不同於我的例子嗎? – barerd 2012-03-20 09:09:25

回答

15

您可以在一個類作爲參數傳遞和往常一樣:

def use_class(myclass) 
    x = myclass.new "test" 
    x.read_name 
end 

use_class(City) 
# returned -> ' You are in a city called "test".' 

但是,你的錯誤是不是與此有關。基本上,你試圖在類的範圍內使用對象game,但它還不存在。

傳遞給遊戲實例的參考級的城市,你可以這樣做:

@city = City.new(city_name, self) 

和修改城市的構造函數

def initialize(city_name, game) 
    @city_name = city_name 
    @game = game 
    end 

隨後,市#介紹會有:

@game.play(@street, :enter, @game) 

可能會有其他錯誤,因爲@street不是定義在城市編輯,但這是另一回事。

+0

當我用這種方式研究這個問題時,這聽起來非常合乎邏輯和簡單。正如我所提到的,我有一個非常陡峭的參數傳遞學習曲線,無論是方法還是課程。我已閱讀並繼續閱讀關於此的教程,但每次都會犯錯。你能介意給我一個關於傳遞參數或面向對象的好文檔,以便我可以自己找到@street應該如何在City中定義。 – barerd 2012-03-20 13:29:51

+0

\ @var_name是類變量/成員/字段。看看@city_name是如何初始化的。這裏是關於ruby中的類的[tutorial](http://juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/)。 – Candide 2012-03-20 13:34:46

+0

我之前閱讀過該教程。讓我這樣說:我怎樣才能在類A的另一個對象內引用一個類B的對象,而A或B都不相互繼承?當他們中的一個繼承時,我可以做到。我仍然在使用代碼的第一部分(myclass),並且正在撰寫此評論,以便它不會太遲,對不起。 – barerd 2012-03-20 14:34:26

相關問題