有人可以解释一下代码如何工作

sof*_*ofi 4 ruby metaprogramming

有一些代码:

def func
   def func
      1
   end
end
Run Code Online (Sandbox Code Playgroud)

然后我尝试以下方法irb

func
func.func
func
Run Code Online (Sandbox Code Playgroud)

并得到结果:

:func
1
1
Run Code Online (Sandbox Code Playgroud)

有人可以解释发生了什么吗?我有点了解第一个输出,但不了解后者。谢谢!

mrz*_*asa 5

您可以在全局范围内的方法内定义方法。方法定义返回一个带有名称的符号。

  1. func首次调用时,它由inner重新定义func。这就是为什么后续调用funcreturn 的原因1
  2. 方法定义返回一个符号,您可以在该符号上调用任何全局定义的方法,这就是为什么可以调用的原因func.func。尝试定义其他方法,您将可以在任何符号上调用它:
def func
   def func
      1
   end
end
def a
  'a'
end
func.a
# 'a'
:asd.a
# 'a'
Run Code Online (Sandbox Code Playgroud)

  • @sofi关键是,如果您在irb全局命名空间中定义一个方法,该方法将被添加到几乎所有Ruby对象都包含的`Kernel'中。通过在全局名称空间中定义`a`方法,`1.a`将起作用,`:foo.a`将起作用,`“ foo” .a`将起作用。当调用`foo.foo`时,您只需在第一个`foo`调用的返回值上调用`foo`。 (2认同)