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

看板Ruby作者 (一心不乱)時間9年前 (2015/11/09 13:46), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
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 去。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.114.201 ※ 文章網址: https://www.ptt.cc/bbs/Ruby/M.1447047993.A.36E.html
文章代碼(AID): #1MG3CvDk (Ruby)
文章代碼(AID): #1MG3CvDk (Ruby)