首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Module#const_set与Module#module_eval的区别

Module#const_set与Module#module_eval的区别
EN

Stack Overflow用户
提问于 2010-10-01 12:15:04
回答 1查看 724关注 0票数 3

他们不是应该做同样的事情吗?为什么会发生这种情况?此时,出于需要,我在代码中使用了module_eval,但const_set似乎更具可读性。无论如何,我真的很想知道为什么会发生这种情况。

代码如下:

代码语言:javascript
复制
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"
EN

回答 1

Stack Overflow用户

发布于 2010-10-01 12:47:03

您的module_eval实际上并没有将常量放入模块中。然后,您只需从main访问它:

代码语言:javascript
复制
module B;end
B.module_eval { FOO = 'asdf' }
>> FOO
=> "asdf"

你可以用self::FOO = 'asdf'解决这个问题,然后它就和B.const_set(:FOO,'asdf')一样了。您也可以像这样更直接地执行此操作:

代码语言:javascript
复制
B::FOO = 'asdf'

你的代码的主要问题是你不能像那样访问其他模块的常量。如果它们位于外部模块中,则需要使用::前缀指定常量的作用域:

代码语言:javascript
复制
def foo
  B::FOO
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3836499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档