我一直在读这本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
优先于最外面的CONST
在method2
中,CONST
作用域内的Mod
在词汇上是不可见的,因此访问最外层CONST
。
至于方法定义本身,当名称限定为前面的模块常量(例如Mod
或Mod::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/