iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0
Software Development

Ruby 研究 30 天系列 第 14

Day 13 - 類別變數與實體變數

  • 分享至 

  • xImage
  •  

類別變數:

類別變數顧名思義是能夠在類別裡被定義的變數,寫法是 @@ 為開頭。
以目前為止的學習經驗中,使用到類別變數的時機非常少,因此接下來的介紹會著重在實體變數。

實體變數

在 Ruby 裡的實體變數是前面加一個 @ 為開頭,這個變數代表實體其獨特的屬性( attribute )。

因為實體變數的 scope 橫跨了整個類別,所以它能夠在同一類別的方法之間傳遞,如果利用 initialize 的特性,當新的實體被 new 出來時,便自動執行一次,把參數傳進類別並指定給實體變數,因此就變成了該實體獨一無二的屬性,不會與其他實體共享。

class Dog
  def initialize(color = "黑", age = 2)
    @color = color
    @age = age
  end

  def introduction
    "這是一隻#{ @color }色的小狗,牠現在#{ @age }個月大了!"
  end
end

husky = Dog.new( "灰", 8 )
puts husky.introduction       # 印出 這是一隻灰色的小狗,牠現在8個月大了!

shiba_inu = Dog.new( "棕", 13 )
puts shiba_inu.introduction   # 印出 這是一隻棕色的小狗,牠現在13個月大了!

puppy = Dog.new
puts puppy.introduction       # 印出 這是一隻黑色的小狗,牠現在2個月大了! 

剛剛提到實體變數的 scope 橫跨了整個類別,這也代表一旦離開類別就失效了,那如果我真的很想要在類別外取得這個屬性,甚至指定新的屬性給該變數呢?這裡必須定義同名的方法來獲得實體變數的值,再利用同名方法加上 = 作為另一個方法來重新傳參數給實體變數。

class Dog
  def initialize(color = "黑", age = 2)
    @color = color
    @age = age
  end

  def introduction
    "這是一隻#{ @color }色的小狗,牠現在#{ @age }個月大了!"
  end

  # getter
  def color
    @color
  end

  # setter
  def color= (new_color)
    @color = new_color
  end
end

husky = Dog.new( "灰", 8 )
puts husky.color #印出 灰
husky.color = "紅"
puts husky.color #印出 紅

這種手法因為很常使用,所以已經內建了三個方法了:attr_reader , attr_writer及attr_accessor,以上述例子來說, attr_reader 等同於 getter , attr_writer 等同於setter , attr_accessor 則等同於前兩者,我們改寫如下,可以省掉很多程式碼。

class Dog
  attr_accessor :color, :age
  
  def initialize(color = "黑", age = 2)
    @color = color
    @age = age
  end

  def introduction
    "這是一隻#{ @color }色的小狗,牠現在#{ @age }個月大了!"
  end
end

此文同步刊登於CJ-Han的網站


上一篇
Day 12 - 事件觸發 ( EventEmitter )
下一篇
Day 14 - 類別方法與實體方法
系列文
Ruby 研究 30 天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言