Ruby 新手入門隨手記 attr_reader 、 attr_writer 、 attr_accessor?

本文將會介紹並比較 attr_accessor 、 attr_reader、attr_writer 之間的差異

還記得第一次看到 attr_accessor :cat 其實等於

def cat 
  @cat          #宣告了一個 @cat 的實體變數     
end  
def cat= (cat)         
  @cat = cat    #把 @cat = cat 這個參數     
end

再次的見識到 ruby 的強大啊! 一行抵六行! 等等…那個 cat= (cat) 等於不把它分開嗎?
答案是不行!!
當下真的是滿臉黑人問號
在了解之前要先有個觀念
在 ruby 裡面其實『方法可以覆寫』!

class Cat 
  @count = 0     
  def self.new(*)         
    @count += 1         
    super     
  end 
end

在這例子裡面偷偷的把 new 方法偷偷的覆寫掉了
導致每次執行 Cat.new 的時候 @count 都會+1
Ruby在跑程式碼的時候會先看自己的class有沒有實作method
沒有的話就往上找,有的話就用自己的( new
到這裡就有點了解為什麼上面的cat= 不能分開了
其實他在偷偷做一些事情
讓我們實際做一次

class Animal   
  
  def cat          
    @cat     
  end   
       
  def cat= (cat)             
    @cat = cat  
  end 
end  
doraemon = Animal.new p doraemon.cat = 3     #3

不要=了,改成cat會怎樣呢?

class Animal     
  
  def cat         
    @cat     
  end          
  def cat (cat)             
    @cat = cat  
  end 
end     
doraemon = Animal.new     
p doraemon.cat = 3  #會出現undefined method `cat='

當你在 doraemon.cat = 3 的時候
看起來像是在做賦值的動作
其實是在呼叫『cat= (cat)』這個 method,並且把『3』這個參數丟給他
再回來主題
其實 attr_reader 在做這件事

def cat          
  @cat        #宣告@這個實體變數的存在     
end
attr_writer 則是
def cat= (cat)          
  @cat = cat  #有賦值的功能     
end

attr_accessor則是readerwriter兼具
至於什麼時候該用哪個就要看你的程式要做什麼功能了