2010-10-01 84 views
3

他们不应该做同样的事情吗?这是为什么发生?在这一点上,我不必要地在代码中使用module_eval,但const_set似乎更具可读性。无论如何,我真的很想明白为什么会发生这种情况。Module#const_set和Module#之间的差异module_eval

下面的代码:

class A 
    def foo 
    FOO 
    end 
    def self.foo 
    FOO 
    end 
end 
module B 
    class C < A 

    end 
end 
B.const_set(:FOO,'asdf') 
>> B::C.foo 
NameError: uninitialized constant A::FOO 
    from ./foo.rb:6:in `foo' 
    from (irb):1 
>> B.module_eval {FOO='asdf'} 
=> "asdf" 
>> B::C.foo 
=> "asdf" 
+3

不要忘记承认有人回答你的问题;选择答案。 – Tom 2011-03-16 00:08:26

回答

2

你module_eval实际上并没有把常量的模块中。然后,你只是从主访问它:

module B;end 
B.module_eval { FOO = 'asdf' } 
>> FOO 
=> "asdf" 

您可以修复与self::FOO = 'asdf',那么它一样B.const_set(:FOO,'asdf')。你也可以做到这一点更直接像这样:

B::FOO = 'asdf' 

与您的代码的主要问题是,你不能从这样的其他模块访问常量。如果他们的外部模块中,你需要指定常量的范围与::前缀:

def foo 
    B::FOO 
end 
+0

啊,谢谢。这解释了它。回到绘图板 :( – Mike 2010-10-01 05:01:03

相关问题