Ruby 中同名的模块和类

Module and Class with the same name in Ruby

提问人:johndisk 提问时间:4/9/2020 最后编辑:johndisk 更新时间:4/28/2020 访问量:230

问:

例如,我有模块“A”模块“B”。模块 B 中,有一个名为“A”的类,就像模块“A”一样。在这个类中,我想引用 A::ClassC,其中“A”是模块,但我收到错误,因为它认为我引用的是没有 ClassC 的类 A我能解决这个问题吗?还是我需要重命名一个?(我想尽可能避免这种情况)

编辑:

这是我当前实现的一个示例,它不起作用,仅供参考。

    >moduleA
        >classC.rb
    >moduleB
        >classA.rb
        >classB.rb

类A.rb:

module B
    class A < classB

    do something with A::ClassC

    end
end

错误是uninitialized constant ModuleB::ClassA::ClassC

Ruby Ruby-on-rails-3 模块 命名空间

评论

1赞 Jörg W Mittag 4/9/2020
“我收到错误”——这些错误会告诉你出了什么问题,错误发生在哪里,以及你是如何到达那里的。没有这些错误,就不可能知道发生了什么。请构建一个最小的可重复示例。请注意,这三个词都很重要:它应该只是一个示例,你不应该发布你的实际代码,而应该创建一个简化的例子来演示问题。它应该是最小的,即不包含任何不需要证明问题的内容。它应该是可重现的,这样如果我复制和粘贴并运行代码,我会看到与你看到的相同的问题。
1赞 Jörg W Mittag 4/9/2020
从您的描述来看,听起来这两个常量位于不同的命名空间中,因此应该没有问题,也没有错误,但是如果没有错误和代码,就无法判断可能发生了什么。
0赞 Stefan 4/9/2020
“我有模块 A 和模块 B......”——只需展示您的代码,而不是描述它。
0赞 johndisk 4/9/2020
@JörgWMittag是的,对不起。错误是 。谢谢。uninitialized constant ModuleB::ClassA::ClassC
0赞 Jörg W Mittag 4/10/2020
该错误不可能来自您发布的代码。你的代码中没有,你的代码中没有。一定还有其他事情发生,你没有向我们展示。没有这一点,就不可能弄清楚可能出了什么问题。正如我在之前的评论中所说,从您的描述中听起来这两个常量位于不同的命名空间中,因此应该没有问题。ModuleBClassA

答:

2赞 Fabio 4/9/2020 #1

使用作用域解析运算符确定可以从哪个作用域类中找到。
在你的例子中,你想要一个“main”作用域,所以使用运算符作为前缀 -
::C::::A::C

module A
  class C
    def name
      "I am class C from module A"
    end
  end
end

module B
  class A
    def test
      ::A::C.new.name
    end
  end
end

name = B::A.new.test
# => "I am class C from module A"