在Ruby中打开嵌套的模块异常

为什么根据使用的语法重新打开嵌套模块会得到不同的结果? 例如,这工作正常:

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>'

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


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

在你的第一个例子中,看起来你可能需要在module E块中定义Ee ,但事实上你不需要:

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

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

链接地址: http://www.djcxy.com/p/72619.html

上一篇: opened nested module anomaly in Ruby

下一篇: trivial sums of outer products without temporaries in numpy