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