在不同的模块中定义具有相同名称的常量是否合法?

时间:2015-10-13 23:28:10

标签: ruby

我在两个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中是合法的吗?这种情况有最好的做法吗?

2 个答案:

答案 0 :(得分:1)

在不同的命名空间中定义具有相同名称的常量当然是可以的。这就是拥有命名空间的全部目的。

但是,在您的情况下,警告消息表明您认为属于两个不同名称空间的内容实际上并非如此。它们位于同一名称空间中。因此警告。请注意,即使在这种情况下,也不是错误。 Ruby可以在运行时重新定义常量。只是气馁。

答案 1 :(得分:1)

TL; DR

  

警告:已初始化常量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模块中的某个位置 - 或者至少一个您的其他模块未正确嵌套。