我可以通过控制台访问实例中的类变量吗?
问题描述:
我有几类,从一个类继承:我可以通过控制台访问实例中的类变量吗?
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
答
尝试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
稍微好一点的办法是使用':@@ terms'但你得到一个+1反正。 – 2012-02-14 22:23:36
@Sergio确实有效,哇,这很复杂。在Ruby中遇到一些非常复杂的东西时很奇怪 - 通常很简单。在C#中,从超类访问变量或从类访问变量之间并没有任何区别。 :/ – jcollum 2012-02-14 22:31:10
@jcollum:恩,这不是c#:)更新了答案。 – 2012-02-14 22:36:31