2011-05-18 111 views
5

有時我會看到一個實例變量,定義爲@my_variable。但是,有時我會看到self.my_variable。什麼時候使用?Ruby實例變量和方法

+2

在Ruby中,它們通常在'snake_case'中,像'@ my_variable'和'self.my_variable'。 – 2011-05-18 01:50:12

+0

我認爲這個問題以前被問過,但是我不能找到它 – 2011-05-18 01:52:54

回答

1

實例變量比調用它們的方法更重要。在self.myVariable中,myVariable是涉及實例變量@myVariable的方法,該方法通常由attr_readerattr_accessor定義。

面向對象編程的一個目的是將特定於該實例內的實例的東西封裝起來,並使其從外部不可訪問。這樣,您可以避免不必要的名稱衝突。這對於實例變量是正確的。它們通常是要在實例中處理的參數,不能在實例外使用。

在一個實例中,它的實例變量可以直接引用,因此不需要通過方法調用來引用它們。你應該直接調用變量@myVariable

從實例外部,由於上述原因,不能直接引用實例變量。但有時候,你需要參考他們。使用方法myVariable的目的是從實例外引用實例變量。

12

實例變量(@variable)對應於其他語言的私有變量。 self.myvariable實際上不是一個變量,而是一個方法的調用。同樣,如果您編寫self.myvariable = something,則實際上是致電self.myvariable=(something)。這與其他語言中的getter和setter屬性相對應。

class Foo 
    def initialize 
    @bar = 42 
    end 

    def xyzzy 
    123 
    end 

    def xyzzy=(value) 
    puts "xyzzy set to #{value}!" 
    end 
end 

obj = Foo.new 
puts obj.xyzzy # prints: 123 
obj.xyzzy = 2 # prints: xyzzy set to 2 
puts obj.bar # error: undefined method 'bar' 

您可以使用attr_readerattr_accessor自動定義的getter和setter的實例變量。 attr_reader將只生成一個吸氣劑,而attr_accessor生成兩者。

class Parrot 
    attr_accessor :volts 

    def voom 
    puts "vooming at #{@volts} volts!" 
    end 
end 

polly = Parrot.new 
polly.volts = 4000 
polly.voom 
+0

我不認爲Rubyists是指「屬性」 - 他們傾向於指「屬性」 – 2011-05-18 02:00:15

+0

@Andrew - 做你是指不同的事情? – Brandon 2011-05-18 02:35:04

+0

@Brandon:我想是的,但我會稍後再檢查。 – 2011-05-18 02:38:24

0

@my_variable直接指向實例變量,並且(大部分)是從該實例外部不可訪問的。

self.my_variable使用的存取方法(如用attr_readerattr_writerattr_accessor內部定義,這是在情況下,有可能不命名@my_variable(如用ActiveRecord模型的情況下的實例變量屬性)或其中內部狀態與公開暴露的內部狀態不同