What is the difference between class and instance variables?
類別變數與實體變數差異是什麼?
上一篇介紹了物件的基本概念,物件有狀態(state)和行為(behavior),而對應到程式裡,狀態就是實體變數(instance variables),行為就是方法(method)。
實體變數用來儲存資料(data),而方法則是定義程式的邏輯。
顧名思義,實體變數為存在於實體內的變數,在實體被創造的時候被宣告,每個實體是互相獨立的,所以改變一個實體的實體變數,並不會影響另一個實體的實體變數。在Ruby裡以@
開頭來表示實體變數(ie:@name
)。
類別變數是所有從這個類別所產生的實體所共享的變數,在Ruby中使用@@
開頭取名。
下面與實例說明兩個的差別:
class Human
@@amount = 0
def initialize(name)
@name = name
@@amount = @@amount + 1
end
def say_my_name
puts "I'm #{@name}."
end
def how_many_people
puts "#{@@amount}"
end
end
John = Human.new('John')
Mary = Human.new('瑪麗')
John.say_my_name # => I'm John.
Mary.say_my_name # => I'm 瑪麗.
John.how_many_people # => 2
Mary.how_many_people # => 2
先一個Human
類別,在創造實體時,代入name
參數,利用實體變數@name
將name
存取,可以看到的是John跟Mary是兩個獨立的實體,呼叫say_my_name方法印出實體變數@name
,並不會互相影響。
類別變數就不同,類別變數是整個類別所創造出的實體都可以共用的變數,John跟Mary雖是兩個獨立的實體,但可以共享類別變數@@amount
,所以印出相同的數字2。
實體變數為存在於實體中的變數,每個實體是互相獨立的,改變其中一個實體變數,並不會影響到例外一個實體的實體變數。
類別變數則是同一類別下的實體所共享的變數,改變其中一個實體變數的類別變數是會影響其他實體的。
在Ruby中實體變數以開頭@
,類別變數以開頭@@
。