iT邦幫忙

2

ruby新手入門隨手記 attr_reader 、 attr_writer 、 attr_accessor有什麼差別?

HJ 2019-05-19 12:52:56214 瀏覽

還記得第一次看到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則是reader跟writer兼具

至於什麼時候該用哪個就要看你的程式要做什麼功能了


尚未有邦友留言

立即登入留言