2014-11-25 80 views
-1
class Player 
    include Playable 

    attr_reader :points 
    attr_accessor :health, :name 

    def initialize(name, health=100, points=0) 
     @name      = name.capitalize 
     @health      = health 
     @found_treasures = Hash.new(0) 
     @points      = points 
    end 
    end 

module Playable 

    def blam 
     self.health -= 10 
     puts "#{name} just got blammed yo." 
    end 

    def w00t 
     self.health += 15 
     puts "\n#{name} just got w00ted." 
    end 

    def score 
     self.health + points 
    end 

    def strong? 
     health > 100 
    end 


end 

所以在上面的代碼中的實例方法中,我明白的是,爲了設置屬性的健康,它需要1)是在類的存取方法,我包括模塊in和2)它需要模塊中的自我。紅寶石自我在模塊

在這種情況下,自我指的是什麼?由於模塊中的方法是實例方法,因此需要在對象上調用它們,所以self指向Player類的實例?如果這是正確的,那麼self.health指的是一個attr_accessor方法,這段代碼很有意義。沒有「自我」這個詞,它會是一個局部變量賦值是否正確?這是什麼?

+0

不,「健康」和「self.health」一樣是對訪問者的調用。儘管如此,「self.health」更加明確和可讀。 – Amadan 2014-11-25 06:48:21

回答

-1

attr_accessor只是一個Module的方法。根據文件,它(幾乎:信用@JörgWMittag)創建一個實例變量和兩個getter方法health和setter方法health=(是否要創建的getter/setter僅分別使用attr_readerattr_writer。)

當Ruby解釋器找到一個新名稱時,它會嘗試使用此名稱創建新本地變量,然後再解析它。一旦吸氣劑被定義,它就會被使用。

直到你得到了health(定義明確或在attr_getter/attr_accesor的幫助下),這段代碼將創建具有該名稱的本地變量。

希望它能通過。

+0

這是錯誤的。 'attr_accessor'不會創建一個實例變量。分配給實例變量會創建一個實例變量。在創建任何實例之前,如何在類定義時執行它時甚至會創建一個實例變量?* * * * attr_accessor *另外,局部變量會影響方法,而不是相反。你是否有吸氣沒關係。 – 2014-11-25 14:48:55

+0

@JörgWMittag我更正了關於實例變量的措辭,謝謝。我從來沒有說方法會影響局部變量:「找到一個**新的**名稱,它會在創建新的局部變量之前嘗試解析它。」 – mudasobwa 2014-11-25 15:35:41