iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 7
0
Modern Web

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

Ruby on Rails面試題挑戰 Day07 - 請談談Ruby中的getter和setter

Tell me about getters and setters in Ruby
請談談Ruby中的getter和setter

介紹完方法後,我們在談回物件的狀態,在其他的程式語言中可能為稱之為屬性(attribute)也就是物件的資料,Ruby中的物件的狀態對應到的是實體變數(instance variable),而需要取用實體變數則需要靠getter及setter。

getter讓我們可以取用實體變數,而setter讓我們可以設定一個實體變數。

下面看程式碼會更清楚。

class Dog
  def initialize(name)
    @name = name
  end
end

dog1 = Dog.new("prince")
dog1.name 
# => undefined method 'name' for #<Dog:0x000055aad58658c8 @name="prince"> 
dog1.name = "lala" 
# => undefined method 'name=' for #<Dog:0x000055bb26a119e0 @name="prince">

像上面這樣直接想用dog1.name來取用實體變數,錯誤訊息為dog1物件並沒有name方法的,需要定義name方法,這樣協助我們取用實體變數的方法就稱為getter。

而用dog1.name = "lala"來改動實數變數儲存的資料也是會出錯,需要定義定義name=方法,而這協助我們設定實體變數資料的稱之為setter。

class Dog
  def initialize(name)
    @name = name
  end
  
  def name
    @name
  end
  
  def name=(new_name)
    @name = new_name
  end
end

dog1 = Dog.new("prince")
puts dog1.name # => prince

dog1.name = "lala"
puts dog1.name # => lala

但每次都要寫這兩個方法非常麻煩,所以Ruby就提供了以下幾種寫法

  • attr_reader
  • attr_writer
  • attr_accessor

像上面name的getter與setter可以用attr_accessor :name來取代
,而如果想要只有getter就使attr_reader,只想要有setter就是用attr_writer

class Dog
  attr_accessor :name

  def initialize(name)
    @name = name
  end
end

dog1 = Dog.new("prince")
puts dog1.name # => prince

dog1.name = "lala"
puts dog1.name # => lala

你可以這樣回答:

getter讓我們可以取用實體變數的值,而setter讓我們可以設定一個實體變數的值,在ruby中提供attr_readerattr_writerattr_accessor的簡易寫法來讓我們使用getter與setter。

參考資料

  1. Wiki - Mutator method
  2. 為你自己學 Ruby on Rails

上一篇
Ruby on Rails面試題挑戰 Day06 - 當你在Ruby中呼叫方法的時候發生了什麼事?
下一篇
Ruby on Rails面試題挑戰 Day08 - 類別(Class)與模組(Module)的差異在哪裡?
系列文
Ruby on Rails面試題挑戰30

尚未有邦友留言

立即登入留言