如何在Ruby中找到方法的嵌套?

Ste*_*fan 6 ruby reflection nested constants

在Ruby中,常量查找受嵌套影响,方法保留其嵌套.

例如,如果我有这些模块:

module A
  X = 1
end

module B
  X = 2
end

module Foo
end
Run Code Online (Sandbox Code Playgroud)

我可以定义Foo.a一个嵌套的方法[A, Foo]:

module Foo
  module ::A
    Module.nesting #=> [A, Foo]
    def Foo.a
      X
    end
  end
end

Foo.a #=> 1
Run Code Online (Sandbox Code Playgroud)

以及Foo.b嵌套的方法[Foo, B]:

module B
  module ::Foo
    Module.nesting #=> [Foo, B]
    def Foo.b
      X
    end
  end
end

Foo.b #=> 2
Run Code Online (Sandbox Code Playgroud)

如果我定义Foo::X:差异变得明显:

Foo::X = 3

Foo.a #=> 1  <- still resolves to A::X
Foo.b #=> 3  <- now resolves to Foo::X
Run Code Online (Sandbox Code Playgroud)

但是如何确定给定方法的嵌套?

Eri*_*nil 4

这会起作用:

Foo.method(:a).to_proc.binding.eval('Module.nesting')
#=> [A, Foo]

Foo.method(:b).to_proc.binding.eval('Module.nesting')
#=> [Foo, B]
Run Code Online (Sandbox Code Playgroud)

使用 Ruby 2.2.1 和 2.3.1 进行测试。它不适用于 Ruby 2.1.5。

  • 假设这是一个有根据的猜测,有助于官方 Ruby 文档。 (2认同)