我一直在读这本书的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常量查找一个很好的解释在这里
我会解释一下共享代码片段:
CONST = "outer"
module Mod
CONST = 1
def Mod.method1
# module method
Module.nesting # => [Mod]
CONST + 1
end
end
module Mod::Inner
def (Mod::Inner).method2
Module.nesting # => [Mod::Inner]
CONST + " scope"
end
end
Mod::CONST # => 1
Mod.method1 # => 2
Mod::Inner::method2 # => "outer scope"
看一看的评价Module.nesting
以上(Mod::Inner).method2
看起来Mod::Inner
作为嵌套指定CONST
它没有找到它呼吁主要对象之前CONST
在我下面的例子中,你会看到Mod::Inner.method2
使得以国防部::内,然后国防部打电话寻求CONST
它发现,所以没有需要调用CONST
的对象
module Mod
CONST = 1
def Mod.method1
Module.nesting # => [Mod]
CONST + 1
end
module Inner
def (Mod::Inner).method2
Module.nesting # => [Mod::Inner, Mod]
CONST.to_s + " scope"
end
end
end
Mod::CONST # => 1
Mod.method1 # => 2
Object::CONST # => "outer"
Mod::Inner::method2 # => "1 scope"
有疑问时使用嵌套类/常量定义过的词汇,它总是做正确的事如预期