2013-12-09 73 views
0

我知道在類實例中,我應該通過實例變量讀取變量的值。 但是通過自我閱讀的後果是什麼?使用self讀取實例變量

見下面的例子:

class Test attr_writer :aa 
    def testing 
    puts @aa 
    puts self.aa <-- what are the consequences if I apply attr_reader :aa and try to read 'aa' via self.aa ? can I read other value by accident? 
    end 

    def self.bb 
    a = self.new 
    a.aa = "111" 
    a.testing 
    end 
end 

Test.bb 
+0

'puts self.aa'與'puts aa'相同。這是因爲'self'是默認的接收器。由於'testing'是一個實例方法,它被'Test'的一個實例調用,所以'self'等於方法中的實例。您可以通過在方法中添加'puts「self =#{self}」'來確認。 'puts aa'(或'puts self.aa')的效果取決於您是否創建了'aa'的訪問器(例如'attr_reader:aa')。如果有的話,'puts aa'會通過訪問器給出@aa的值;如果你沒有,會引發異常,通知你沒有局部變量或方法'aa'。 –

+0

好的,任何特定的原因:「但是由於各種原因,建議使用該方法而不是@variable。」 ? –

回答

0

在您的例子中,變量是一個實例變量,你只需用self.new

創建的對象也很重要,要知道,testing法自我引用之內該對象,而不是類似於你認爲。在bob方法中,因爲它是一個類方法,所以自引用類。儘管如此,您可以在類本身內部創建實例變量(不要與類變量@@混淆,這些類變量@@可在所有類對象和類本身中訪問)。

這是一個它可以看起來像樣的例子。

class Test 

    class << self 
    attr_writer :bb 
    end 

    def self.bb 
    @bb 
    end 
end 

Test.bb = 1 
Test.bb 
+0

謝謝我編輯了我的文章並將'class'更改爲'instance' –

+0

好吧我明白你寫了什麼,並且我明白不同之處,但我只是想知道如果我嘗試使用self讀取變量會出錯。 aa代替測試方法中的@aa –

+0

如果使用attr_reader:aa與使用'def aa; @aa;結束「,所以它幾乎相同。但由於各種原因,建議使用該方法而不是@variable。 –