昨天文章在取用實體變數的時候,提到Ruby內建的三個方法attr_reader
、attr_writer
以及attr_accessor
,那這三個方法分別是做什麼的呢?列出來大概是這樣。
什麼是Getter與Setter?先從程式碼來看,當我們定義name
、name=
的方法時,其實就是在寫Getter與Setter的方法。
class Girl
def initialize(name)
@name = name
end
def name # 給name定義getter方法
p @name
end
def name=(new_name) # 給name定義setter方法
p @name = new_name
end
end
sophia = Girl.new('Sophia')
sophia.name # 呼叫getter方法,回傳 "Sophia"
sophia.name = 'Dora' # 呼叫setter方法,回傳 "Dora"
那為什麼不這樣寫就好了?(菜鳥式疑問
只能說這樣得寫法實在太過於囉唆,所以Ruby創建attr_reader
、attr_writer
以及attr_accessor
,就是讓我寫起來更利落方便。
這三個方法可以快速的在Ruby的類別裡產生一對getter以及setter方法,從例子來看attr_reader、attr_writer以及attr_accessor,我們利用instance_methods(false)
來查看結果:
class Girl
attr_reader :name,:age
def initialize(name, age)
@name = name
@age = age
end
end
girl = Girl.new("Sophia", 3)
從attr_reader身上我們會得到:name
、age
方法
class Girl
attr_reader :name
… (略)
end
p Girl.instance_methods(false) # => [:name]
從attr_writer身上我們會得到name=
的方法,
class Girl
attr_writer :name
… (略)
end
p Girl.instance_methods(false) # => [:name=]
從attr_accessor身上則是得到:name
、name=
兩個Getter與Setter的方法都擁有。
class Girl
attr_accessor :name,:age
… (略)
end
p Girl.instance_methods(false) # => [:name,:name=]
以上,能讓你更快速產生getter以及setter方法,請依照個人需求選用喔~
參考連結:
How getter/setter methods work in Ruby
Ruby 語法放大鏡之「attr_accessor 是幹嘛的?」