我可以通过控制台访问实例中的类变量吗?

问题描述:

我有几类,从一个类继承:我可以通过控制台访问实例中的类变量吗?

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,我可以看到它们的存在,但有什么办法通过导轨控制台直接访问它们?

你几乎做到:)

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

尝试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