Instance variable
在程式碼中我們常能看到單一個@開頭的變數,但是可別一味把它當成是instance variable喔,如果是在instance method中被創造出來的那肯定是instance變數,但要小心這種情況:class Med @@c='This is class variable' @c='This is class instance variable' def self.class_instance_c @c end def class_c @@c end def instance_c @c end end m = Med.new puts m.class_c #->'This is class variable' puts m.instance_c #->'' puts Med.class_instance_c #->'This is class instance variable'上面的@c其實是class instance variable,是不能被物件實例存取的。
而當物件實例想要存取的@c是instance variable,並沒有被定義出來,所以才會是nil,印不出東西。
Class instance & Class instance variable
相較Class instance variable,Class variable比較好辨認,"@@"開頭的就是了。這兩種變數的差別在於,Class variable是共用於繼承鏈上的,當Class variable被改動時,所有繼承鏈上的其他類別的此變數也會被改動。
可以想像成是直接改動javascript中的prototype但是Class instance variable是各個類別獨立的,「可以被繼承,但是繼承給子類別後就沒有任何關係了」
cattr_accessor
就像是attr_accessor一樣,只是他提供的是對Class variable的讀寫,而不是instance variable參考資料
[ihower] 深入Rails3: ActiveSupport 的 class_attribute[ihower] 一些 Ruby Dynamic Features 記事 (1) OOP