class A
class << self
CONST = 1
end
end
puts A::CONST # this doesn't work
有没有办法通过这个自调用类来从类外部访问常量?
它实际上是这样做的:
class A
self.CONST = 1
end
我明白我可以将常数移出此自我调用以轻松解决此问题。 我对红宝石的内部运作更加好奇。
答案 0 :(得分:4)
不完全是你想要的,但你只是没有在A类中定义CONST,而是在其元类中定义了CONST,因此我保存了对...的引用。
class A
class << self
::AA = self
CONST = 1
end
end
puts AA::CONST
答案 1 :(得分:4)
你的问题是你误解了代码的含义。
class << self
FOO = :bar
end
不等同于self.FOO = :bar
。它与此截然不同。它相当于self.singleton_class.const_set(:FOO, :bar)
。
我认为你假设class << self
意味着“假设在我写这里之前有一个隐含的'自我'”或者其他某些东西(也许你正在考虑JavaScript的with
陈述) 。它实际上做的是把我们放到self
的单例类的上下文中,这是一个特殊的类,当前对象是唯一的实例。所以你要在对象的单例类上定义常量。
要在类上定义常量,只需编写:
class Something
FOO = :bar
end
答案 2 :(得分:1)
也可能不是你想要的,因为你在A的元类中引用了A类(这似乎是一种欺骗),但它更简洁。
class A
class << self
A::CONST = 1
end
end
深入了解这篇文章的内容是非常有用的 http://www.klankboomklang.com/2007/10/05/the-metaclass/