相关疑难解决方法(0)

为什么 Ruby 在使用双冒号时不将父模块添加到词法范围以进行常量查找?

这个问题的扩展这个问题。答案帮助我了解发生了什么,但我仍在质疑为什么。

在一个模块中定义两个类时,有两种编写方法。

使用模块块:

module Foo
  class FirstClass
    def meth
      puts 'HELLO'
    end
  end

  class SecondClass
    def meth
      FirstClass.new.meth
    end
  end
end

Foo::SecondClass.new.meth
Run Code Online (Sandbox Code Playgroud)

使用双冒号:

module Foo; end

class Foo::FirstClass
  def meth
    puts 'HELLO'
  end
end

class Foo::SecondClass
  def meth
    FirstClass.new.meth
  end
end

Foo::SecondClass.new.meth

Run Code Online (Sandbox Code Playgroud)

两种方式都适用于类定义,但是当使用双冒号时,您不能FirstClassSecondClass不包含FirstClass或写入Foo::FirstClass. 发生这种情况是因为Foo它不是SecondClass用双冒号定义的词法范围的一部分,这可以通过使用Module.nesting.

为什么Foo不用双冒号添加到词法范围?在较低级别的 Ruby源代码的上下文中,为什么ruby_cref只指向Foo::SecondClass而不是ruby_cref指向SecondClassthen 指向Foo

例如:

+---------+       +---------+ …
Run Code Online (Sandbox Code Playgroud)

ruby

6
推荐指数
1
解决办法
124
查看次数

标签 统计

ruby ×1