iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 4
0
Modern Web

Ruby on Rails面試題挑戰系列 第 4

Ruby on Rails面試題挑戰 Day04 - 類別變數與實體變數差異是什麼?

What is the difference between class and instance variables?
類別變數與實體變數差異是什麼?

上一篇介紹了物件的基本概念,物件有狀態(state)和行為(behavior),而對應到程式裡,狀態就是實體變數(instance variables)行為就是方法(method)

實體變數用來儲存資料(data),而方法則是定義程式的邏輯。

實體變數 Instance variable

顧名思義,實體變數為存在於實體內的變數,在實體被創造的時候被宣告,每個實體是互相獨立的,所以改變一個實體的實體變數,並不會影響另一個實體的實體變數。在Ruby裡以@ 開頭來表示實體變數(ie:@name)。

類別變數 Class variable

類別變數是所有從這個類別所產生的實體所共享的變數,在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參數,利用實體變數@namename存取,可以看到的是John跟Mary是兩個獨立的實體,呼叫say_my_name方法印出實體變數@name,並不會互相影響。

類別變數就不同,類別變數是整個類別所創造出的實體都可以共用的變數,John跟Mary雖是兩個獨立的實體,但可以共享類別變數@@amount,所以印出相同的數字2。


你可以這樣回答:

實體變數為存在於實體中的變數,每個實體是互相獨立的,改變其中一個實體變數,並不會影響到例外一個實體的實體變數。

類別變數則是同一類別下的實體所共享的變數,改變其中一個實體變數的類別變數是會影響其他實體的。

在Ruby中實體變數以開頭@,類別變數以開頭@@

參考資料

  1. Ruby user's guide-Instance variables
  2. 為你自己學 Ruby on Rails_類別(Class)與模組(Module)

上一篇
Ruby on Rails面試題挑戰 Day03 - 在Ruby當中幾乎所有的東西都是物件?
下一篇
Ruby on Rails面試題挑戰 Day05 - 類別方法與實體方法差異是什麼?
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言