gpt4 book ai didi

ruby - Module#const_set 和 Module#module_eval 之间的区别

转载 作者:数据小太阳 更新时间:2023-10-29 08:06:16 25 4
gpt4 key购买 nike

难道他们不应该做同样的事情吗?为什么会这样?此时,出于必要,我在我的代码中使用了 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"

最佳答案

您的 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
end

关于ruby - Module#const_set 和 Module#module_eval 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3836499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com