2011-03-09 86 views
8
class A 
    class << self 
    CONST = 1 
    end 
end 

puts A::CONST # this doesn't work 

有没有一种方法可以通过这个自调类访问类外部的常量?类方法中的红宝石常量

它有效地这样做:

class A 
    self.CONST = 1 
end 

我明白,我可以只移动不断进行这种自我调用来轻松解决这个问题。 我对Ruby的内部工作更加好奇。

+0

为什么不设置一个类变量和使用? – Jimmy 2011-03-09 18:27:07

回答

4

不是你想要什么,但你根本就没有定义CONST A级内,但在它的元类,这是我保存,因此一个参考......

class A 
    class << self 
    ::AA = self 
    CONST = 1 
    end 
end 
puts AA::CONST 
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 
+0

谢谢!我不明白self.method和class“self”是不同的。他们都是单身方法。如果您有机会,请在此处查看问题:http://stackoverflow.com/questions/5508351/in-ruby-whats-the-difference-between-self-method-and-a-method-within-class-se – djburdick 2011-04-01 01:43:13