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_reader
、attr_writer
、attr_accessor
的簡易寫法來讓我們使用getter與setter。