2011-06-15 39 views
3

我今天在一些代碼中看到了這個。@自我方法裏面用到的是做什麼的?

class Foo 
    def self.bar 
    @myvar = 'x' 
    end 
end 

究竟是什麼訪問?據我所知,這是不可訪問的表單實例方法。這是什麼叫(谷歌能夠),因爲我似乎無法找到其他任何地方的例子。

回答

7

@myvar語法識別myvar作爲一個實例變量,因此真正的問題是這樣的:

什麼是self一個類的方法裏面?

而答案是「self是類對象」。所以,@myvarFoo類對象的實例變量。如果添加另一個類方法:

class Foo 
    def self.pancakes_house 
     @myvar 
    end 
end 

然後做到這一點:

Foo.bar 
puts Foo.pancakes_house 

你會看到x在標準輸出。

+0

後續問題:在Ruby社區中是否有一種'信仰',關於使用它們是否是好的做法? (它馬上跳出來,因爲我不是線程安全的。) – 2011-06-16 03:33:56

+1

@John:我不知道是否有普遍的共識,我從來不需要這樣的事情。也許如果出於某種原因,你需要一個隱藏在實例中的類變量,你會做這種事情。 – 2011-06-16 03:42:48

3

一個類也是一個對象,所以你在Foo類中設置了一個實例變量。現在

>> Foo.bar 
>> Foo.instance_variable_get("@myvar") 
=> 'x' 

,對於一個典型的使用,添加class << self; attr_accessor :myvar; end到類,你可以寫:

>> Foo.bar 
>> Foo.myvar 
=> 'x' 
1

對於谷歌搜索,這有時被稱爲「類實例變量」。也就是說,恰好是一個類的對象的實例變量。