如何模块解决恒定的范围?(How Do Modules Resolve A Constant'

2019-10-19 03:42发布

我一直在读这本书的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中是如何工作的。 谢谢。

Answer 1:

在Ruby中(以大写字母开头的标识符)常量是基于它们所定义/访问的词汇范围访问。

method1中, CONST的内Mod范围优先于最外面的CONST 。 在method2中, CONST的内Mod范围是不可见的词法,所以最外面的CONST被访问。

作为用于该方法定义本身,当名称与前述模块恒定(例如合格ModMod::Inner ),所述方法被定义为一个“模块的方法”,而不是作为一个实例方法self.class (缺省)。

在模块/方法层级名称由分离:: ,或者可选地在模块和模块的方法,一个之间的分隔符的情况下.

更新 :请注意,为什么原因Mod的常量是不可见的method2Mod不是单独‘开’。 该定义直接跳过Mod::Inner 。 如果代码被更改为:

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

然后, Mod的常量将访问method2 ,并优先于任何的外部范围。



Answer 2:

你会发现关于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"

有疑问时使用嵌套类/常量定义过的词汇,它总是做正确的事如预期



文章来源: How Do Modules Resolve A Constant's Scope?