2013年5月2日 星期四

[RB] class, instance, class instance variable

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