2012-02-14 58 views
0

我有幾類,從一個類繼承:我可以通過控制檯訪問實例中的類變量嗎?

class Bravo << Alpha 
class Charlie << Alpha 

阿爾法有一些類級別的變量:

class Alpha 
    @@terms 

    def initialize 
    ... 
    @@terms ||= load_terms 
    end 
end 

OK,一切都很好,到目前爲止。但我想從控制檯訪問類級變量以進行故障排除。這可能嗎?我已經試過:

# inst is an instance of Bravo for example 
inst.class.superclass:terms 
[email protected]@terms 
inst.class.superclass[:terms] 

沒想到任何的,要真正發揮作用,只是抓住了救命稻草,因爲我無法找到任何問題的答案。我已經證實,類變量通過在那裏:

>> inst.class.superclass.class_variables 
=> [:terms] 

OK,我可以看到它們的存在,但有什麼辦法通過導軌控制檯直接訪問它們?

回答

2

你幾乎做到:)

class Alpha 
    @@terms = 'foo' 
end 

class Bravo < Alpha 
end 

b = Bravo.new 
puts b.class.class_variable_get '@@terms' 
# => foo 

它可能看起來複雜,它可能是這樣的一個原因:鼓勵從與類的內部搞亂(人我不知道,如果這是真的,我只是把它做成了)。

如果您需要定期使用此功能,請爲其添加訪問器!

class Alpha 
    @@terms = 'foo' 

    def self.terms 
    @@terms 
    end 
end 


puts Alpha.terms 
# => foo 
+0

稍微好一點的辦法是使用':@@ terms'但你得到一個+1反正。 – 2012-02-14 22:23:36

+0

@Sergio確實有效,哇,這很複雜。在Ruby中遇到一些非常複雜的東西時很奇怪 - 通常很簡單。在C#中,從超類訪問變量或從類訪問變量之間並沒有任何區別。 :/ – jcollum 2012-02-14 22:31:10

+0

@jcollum:恩,這不是c#:)更新了答案。 – 2012-02-14 22:36:31

2

嘗試pry寶石,這樣的目的是非常有用的(可以作爲Rails的控制檯工作):

$ pry 
[1] pry(main)> class A 
[1] pry(main)* @@a = 1 
[1] pry(main)* end 
=> 1 
[2] pry(main)> a = A.new 
=> #<A:0x101ba8ea0> 
[3] pry(main)> cd a.class 
[4] pry(A):1> @@a 
=> 1 
[5] pry(A):1> cd/
[6] pry(main)> cd A 
[7] pry(A):1> @@a 
=> 1 
+0

它是否像對待目錄那樣的對象?這是奇特的。如果它起作用,它就會起作用。 – jcollum 2012-02-15 15:29:08

相關問題