我一直在读这本Ruby的书,然后有一个我不太明白的例子:

CONST = "outer"
module Mod
    CONST = 1
    def Mod.method1
        # module method
        CONST + 1
    end
end
module Mod::Inner
    def (Mod::Inner).method2
        CONST + " scope"
    end
end
Mod::CONST  # => 1
Mod.method1 # => 2
Mod::Inner::method2 # => "outer scope"

请你给我解释一下(一个详细的解释),这样我就可以完全理解这个作用域在ruby中是如何工作的了。
谢谢您。

最佳答案

Ruby中的常数(以大写字母开头的标识符)可以根据其定义/访问的词法范围来访问。
method1中,CONST范围内的Mod优先于最外面的CONSTmethod2中,CONST作用域内的Mod在词汇上是不可见的,因此访问最外层CONST
至于方法定义本身,当名称限定为前面的模块常量(例如ModMod::Inner)时,方法被定义为“模块方法”,而不是self.class的实例方法(默认值)。
模块/方法层次结构中的名称用::分隔,或者在模块和模块方法之间使用分隔符的情况下,用.分隔。
更新:请注意Mod的常量对method2不可见的原因是Mod没有单独“打开”定义直接跳到Mod::Inner如果代码更改为:

module Mod
  module Inner
    def (Mod::Inner).method2
      ...

然后Mod可以访问method2的常量,并优先于外部作用域中的任何常量。

关于ruby - 模块如何解析常量的作用域?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20848123/

10-13 02:15