他们不是应该做同样的事情吗?为什么会发生这种情况?此时,出于需要,我在代码中使用了module_eval,但const_set似乎更具可读性。无论如何,我真的很想知道为什么会发生这种情况。
代码如下:
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"发布于 2010-10-01 12:47:03
您的module_eval实际上并没有将常量放入模块中。然后,您只需从main访问它:
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
endhttps://stackoverflow.com/questions/3836499
复制相似问题