我在两个Ruby模块中定义了常量LOGGER,假设由于它们位于不同的名称空间中,这样就可以了
module Key
...
LOGGER = 'logger'
...
end
和其他地方
module ThePlatform
module Monitoring
...
module Key
...
LOGGER = 'logger'
...
end
end
end
但这会产生警告信息:
warning: already initialized constant ThePlatform::Monitoring::Key::LOGGER
这在Ruby中是合法的吗?这种情况有最好的做法吗?
答案 0 :(得分:1)
在不同的命名空间中定义具有相同名称的常量当然是可以的。这就是拥有命名空间的全部目的。
但是,在您的情况下,警告消息表明您认为属于两个不同名称空间的内容实际上并非如此。它们位于同一名称空间中。因此警告。请注意,即使在这种情况下,也不是错误。 Ruby可以在运行时重新定义常量。只是气馁。
答案 1 :(得分:1)
警告:已初始化常量ThePlatform :: Monitoring :: Key :: LOGGER
您的错误来自重新定义属于给定命名空间的常量。只要它们位于不同的名称空间中,就没有什么可以阻止你拥有共享名称的常量。
考虑以下简化示例:
module Foo
LOGGER = :log1
module Bar
LOGGER = :log2
end
end
Foo.const_get :LOGGER
#=> :log1
Foo::Bar.const_get :LOGGER
#=> :log2
在此示例中,您可以看到每个命名空间常量都包含不同的值。因此,这样做是完全合法的,并且在其他格式良好的代码中不会发出警告。
因此,问题出在代码的其他地方。最有可能的是,您要重新定义ThePlatform :: Monitoring :: Key :: LOGGER两次,方法是在代码中多次分配该特定常量 - 最有可能(但不一定)在Key模块中的某个位置 - 或者至少一个您的其他模块未正确嵌套。