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)
但是如何确定给定方法的嵌套?
这会起作用:
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。