ruby - 重开Ruby嵌套模块异常

标签 ruby module nested

为什么重新打开嵌套模块会根据使用的语法给出不同的结果?例如,这很好用:

module A
  module E
  end
end
module A
  module E
    def E.e
    end
  end
end

但是这个:

module A
  module E
  end
end
module A::E
  def E.e
  end
end

给出错误:

reopen.rb:6:in `<module:E>': uninitialized constant A::E::E (NameError)
from reopen.rb:5:in `<main>'

(在有人指出这一点之前,解决方法是在定义 E.e 时使用 self 而不是模块名称,但这不是本文的重点。)

最佳答案

module关键字设置一个命名空间上下文,检查对现有模块名称的引用。然后从内到外搜索这些 namespace ,以解析对模块(和类)名称的引用。

在您的第一个示例中,看起来您可能需要定义 E.e里面module E阻止,但实际上你没有:

module A
  module E
  end
end
module A
  def E.e
  end
end

在您的两个示例中发生的是 Ruby 查看当前命名空间,并尝试 <namespace>::E作为模块名称。所以在这两个例子中,它检查的第一件事实际上是 A::E::E这是不存在的。然后它回到下一个上下文。示例的不同之处在于:在第一个示例中,它是 A::E这是有效的,在第二个例子中,它只是 E这不是。然后它抛出的错误与它检查的名字有关。

关于ruby - 重开Ruby嵌套模块异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17589997/

相关文章:

ruby - 如何将十六进制转换为 base64urlsafe?

ruby - 如何捕获 ruby​​ 中的所有异常?

python - 如何将用户输入自动永久存储到字典中

python - 在 Python 中使用变量导入模块

R ggplot2 : overlaying multiple geom_ribbon objects in a single plot using a nested loop

ruby-on-rails - Ruby on Rails : Nested named scopes

ios - Promotion::SplitScreen 中 UIScreen 元素的动态宽度

Ruby 运算符和方法调用

npm - 使用 es6 样式导入导入 npm 模块而无需转译?

java - 获取嵌套的 Hashmap 值