2014-07-03 89 views
0

我有一個這樣的類。我將命令定義爲內部名稱間距的模塊(因爲它響應來自播放器的命令並且定期添加和刪除命令)。但是,Commands中的方法無法看到@environments。我該如何解決?命名空間模塊內部類:實例變量作用域

class Player 
    attr_accessor :environment 

    module Commands 
    def self.look *args 
     @environment.describe 
    end 

    def self.exit *args 
     Kernel.exit(true) 
    end 

    def self.method_missing *args 
     puts "What?" 
    end 
    end 

    def respond arg 
    cmd = arg.split(" ") 
    Commands.send(cmd[0], cmd) 
    end 
end 

回答

0

@environment是一個實例變量,因此它是從Player實例訪問的。一個方法之前添加self使得一個類的方法(在其他語言中的靜態方法),以使上述工作的代碼,你可以這樣做:

class Player 
    attr_accessor :environment 

    def initialize 
    self.extend Commands 
    end 

    module Commands 
    def look *args 
     puts @environment.describe 
    end 
    end 

end 

player = Player.new 
Struct.new("Environment", :describe) 
player.environment = Struct::Environment.new("foo") 
puts player.look 
+0

有沒有辦法對我來說,保持保持命令模塊中的能力一個單獨的命名空間(它是如何在模塊中)? –

+0

@JonathanHoward它已經在一個單獨的命名空間中:'Player :: Commands'。頂層方法在'Player'中。儘管我沒有看到使用模塊的很多價值,除非您計劃與其他課程共享它,或者至少將其移植到它自己的源文件中。 – zetetic