2013-05-28 36 views
0

我跑了一個試圖瞭解singleton如何工作的實驗。爲什麼我們在ruby中使用@@作爲類變量的前綴?

我不明白爲什麼我們用@@代替@作爲類變量的前綴?如下所述,如果變量是與類定義內聯創建的,則self被定義爲Test,並且該變量是一個類變量是否正確?然後,我們可以在單例類定義中使用attr_accessor來訪問它。初始化中的@var似乎不同,因爲self在初始化時被設置爲上下文中的t,所以var在該上下文中屬於t?

這是非常混亂,任何幫助將不勝感激。

class Test 
    @var = 99 
    attr_accessor :var 

    def initialize 
    @var = "Whoop" #if this is commented, pri doesn't print anything. 
    end 

    def pri 
    puts @var 
    end 

    class << self 
    attr_accessor :var 
    end 
end 

t = Test.new 
puts Test.var # Outputs 99 
Test.var = 5 
puts Test.var # Outputs 5 
puts t.pri # Outputs Whoop 

回答

3

如果與類定義內聯創建的變量,自定義爲測試,變量是一個類變量是否正確?

不是。它是一個類的實例變量。它不是一個類變量。

實例變量僅對該實例可見。類變量對類,其他血統類及其實例可見。

  • @var在第2行所定義的用於Test定義(這是Class類的一個實例)。對於血統類Test而言,它不可見,也不適用於它們的實例。
  • @@var定義爲Test以及其祖先類,以及他們的實例。他們都有相同的@@var
  • @var第6行定義的是Test(本身不是Test)的某個實例。它不可見於Test,也不可見於Test的其他實例。
+0

如果它不是一個類變量,我如何能夠訪問Test.var的值?爲什麼在單例中使用attr_accessor允許我改變它?呃,我不明白這一點。 – Senjai

+0

因爲你做了'attr_accessor',它定義了訪問實例變量的實例方法。 'Test'是'Class'類的一個實例。而且由於你創建了一個單例類,'Test'也是單例類的一個實例。 – sawa

+0

OH !,所以@@ var是爲那些繼承自這個類的類共享的嗎? – Senjai

相關問題