Re: [問題] 關於 類別方法 attr_reader

作者: Beersheep (一心不乱)   2015-11-09 13:46:31
Ruby 當中,如果定義了 attr_accessor :name 的話,會產生兩個 method
def name
@name
end
def name=(name)
@name = name
end
所以除非你去覆寫這兩個 method ,否則 name 之後都等於呼叫 name 這個 method
然後 return @name,所以除了 initialze 之外,name 都可以直接取代 @name。
取代 @name 的好處在於,如果有時候你需要對資料本身做一些處理,想要 output
處理後的數據,可以直接修改 method 就好。舉例來說,今天你要顯示電話,可是不想
顯示出電話的最後三碼,你可以直接做:
attr_reader :mobile
def mobile
# 假設電話號碼是 0922-123-345
split_num = @mobile.split("-")
split_num[2] = "XXX"
@mobile = split_num.join("-")
end
當你 call mobile 的時候,它顯示的就會是 0922-123-XXX 而非原本的號碼。
另外一點要注意的是,當你使用 attr_accessor 或是 attr_writer 的時候,雖然
你可以用 name 來取代 @name ,但是當你創造一個新的 method,想要使用 setter 的
時候,例如:
def get_name
# 原本可能是 @name = gets.chomp
# name = gets.chomp 不行
self.name = gets.chomp
end
你如果不用 @name 的話,前面必須要加一個 self. 原因在於如果你沒加 self 的
話,他會認為你是在 get_name 裡面設一個 local variable,就無法 pass 到該物件的
name 去。

Links booklink

Contact Us: admin [ a t ] ucptt.com