2012-03-17 171 views
0

我正在完成The Well Grounded Rubyist,我注意到一些我不太瞭解的實例變量調用。直接從TWGR(第15.2.2節):Ruby實例變量語法

class Person 
    attr_reader :name 
    def name=(name) 
    @name = name 
    normalize_name 
    end 

    private 
    def normalize_name 
    name.gsub!(/[^-a-z'.\s]/i, "") 
    end 
end 

是在normalize_name方法name變量的隱式實例變量? @name.gsub!(/[^-a-z'.\s]/i, "")也能工作嗎?有一些我應該知道的約定嗎?

回答

2

normalize_name發生了什麼name解析爲方法self.name,該方法由類頂部的attr_reader類宏定義。如果你使用attr_accessor相反,name=方法將被定義爲好(但不包括調用normalize_name

這些getter和setter方法自動訪問實例變量。通過attr_accessible :name定義的name方法看起來像對此,主要有:

def name 
    @name 
end 
+0

直接引用'@ name'變量而不是'name'方法有效嗎?使用'name'方法有什麼好處嗎? – rringler 2012-03-17 03:52:10

+0

是的。他們做同樣的基本事情,但使用getter會更安全 - 如果後來決定在讀取而不是寫入時修改數據,該怎麼辦? – coreyward 2012-03-17 03:57:40

+0

明白了。謝謝你的幫助! – rringler 2012-03-17 04:02:39

0

是在normalize_name方法name變量的隱式實例變量

不,它不是一個實例變量。實例變量以@ sigil開頭,但這並不是,ergo,它不可能是實例變量。事實上,它不是一個變量,全部是,它是一個消息發送。