类方法中的Ruby常量

时间:2011-03-09 18:20:39

标签: ruby

 class A
   class << self
     CONST = 1
   end
 end

 puts A::CONST    # this doesn't work

有没有办法通过这个自调用类来从类外部访问常量?

它实际上是这样做的:

class A
    self.CONST = 1
end

我明白我可以将常数移出此自我调用以轻松解决此问题。 我对红宝石的内部运作更加好奇。

3 个答案:

答案 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/