2012-01-25 56 views
0

這裏定義的屬性@color在哪裏?推測在構造函數中的賦值?如果是這種情況,如果一個類型有多個構造函數,其中一個沒有賦值給@colorRuby - 這裏的屬性定義在哪裏?

class Baz 
    def initialize(color) 
    @color = color 
    end 

    def color 
    @color 
    end 

    def color=(value) 
    @color = value 
    end 
end 
+1

注:在Ruby中,你不能定義多個初始化的一類。您可以使用默認值定義初始化程序,例如'def初始化(color ='FFFFFF')'。當您將調用'Baz.new'不帶參數,則默認值將被分配到'@ color' –

+2

我發佈了一個回答你的問題,但我認爲這也非常有用單獨注意到,Ruby有一個漂亮的圖案,很容易讓您可以在不暴露類內部的情況下爲您的實例變量創建健壯的接口。看到這裏對細節:http://www.rubyist.net/~slagell/ruby/accessors.html –

+1

使用這些屬性訪問器的一個很好的優點是,它可以讓你以後手動定義的方法,如果你需要添加比簡單的getter/setter更復雜的功能。它也保存了打字。在您的示例代碼中,您可以只寫'attr_accessor:color'並自動獲取setter/getter方法,而不是定義'color'和'color ='方法。 –

回答

2

ruby​​中的實例變量本身不是「定義的」。它們在使用時會流行起來。

第一次給某個實例變量賦值時,這與「定義」最接近(但實際上它更像是一個「初始化」)。如果您引用尚未分配值的實例變量,則其值將爲nil

所以,如果你的構造並不值分配給@color,然後@color將只是保持未初始化(因此在引用它...除非它被分配一個值在其他地方的構造外的類返回nil其他地方)。

在這裏看到更多的信息:http://www.rubyist.net/~slagell/ruby/instancevars.html

從商品A相關報價:

實例變量並不需要聲明。這表示一個靈活的物體結構 ;實際上,每個實例變量在被首次分配時動態附加到一個對象的 。

和:

與全局變量,實例變量具有零值,直到他們 初始化。

+0

感謝您的幫助,非常清楚。 – Ben

2

,如果什麼類型有多個構造函數,其中之一不分配一個值@color

好,那麼這些情況下不會有@color實例變量和操作在那個變量上可能會失敗。

希望良好的設計和測試能將這些情況的數量減少到零,但這不是語言本身保護您的東西。

請注意,在你的具體例子中,這不應該是一個問題,因爲唯一的操作是設置(這顯然是正確的)和獲取,這也很好 - 檢索實例變量將返回nil如果變量從未設置。

+0

值得指出的是,在類中只能有一個'initialize'方法,因爲Ruby不支持方法重載。 – iftheshoefritz