2015-11-06 20 views
1

我對於訪問實例變量內部的的首選方式感到好奇,該類定義了該實例變量的訪問器。如何讀取由同一類中的訪問器設置的實例變量?

的一種方法是通過直接引用實例變量:

class Example 
    attr_accessor :attribute 

    def meth 
    puts @attribute 
    end 
end 

另一種方法是通過調用訪問創建的讀者:

class Example 
    attr_accessor :attribute 

    def meth 
    puts attribute 
    end 
end 

這是一個小的差異,但我我好奇這是首選的方法,爲什麼。我在讀者看到的唯一優點與直接實例變量訪問的關係是,在測試中對讀者進行存根更容易。

回答

1

最好通過訪問器。例如,如果直接訪問實例變量,然後稍後將該值與讀取器進行轉換,則直接訪問實例變量將不會看到該更改。

當您想使用訪問器設置實例變量的值時,使用訪問器而不是直接訪問實例變量會導致one small quirk

通常情況下,當你寫:

some_meth 10 

...紅寶石會解釋,由於:

self.some_meth(10) 

但是,如果你寫:

age = 10 

...紅寶石不會解釋爲:

self.age=(10) 

相反,ruby會創建一個名爲age的局部變量並將其設置爲10,這對名爲@age的實例變量沒有影響。

爲了呼籲@age的setter,你必須明確地寫self

self.age = 10 

下面是一個完整的例子:

class Dog 
    attr_reader :age 

    def age=(val) 
    @age = val * 7 
    end 

    def initialize val 
    self.age = val #age = val will not call the setter 
    end 

end 

d = Dog.new 10 
puts d.age #=> 70 
+0

事實上,你還添加2「票「對於訪問者來說,雖然差異不是那麼重要。但訪問者只是將「可用性」的價值添加到您的代碼中。 – linkyndy

相關問題