2

我试图通过以下定义捕获未定义的方法:

def method_missing m
  puts "#{m} is missing"
end

当我编写一个未定义的方法时,例如foo在它之后,它被捕获method_missing

foo # => foo is missing

但是当我编写一个未定义的方法时Foo,它不会被捕获method_missing

Foo # => NameError: Uninitialized constant Foo

看起来如果它与一个常数消除歧义,那么它就会被捕获:

self.Foo # => Foo is missing
Foo() # => Foo is missing

为什么Foo没有在第一种情况下被捕获?当方法在局部变量之间不明确时,它是否会被捕获method_missing,但在常量之间不明确时不会被捕获?如果是这样,是否有这方面的文档?或者,这是一个错误?

4

1 回答 1

7

问题是这实际上并不模棱两可——它只是不直观。在 Ruby 的语法中,以大写字母开头且后面没有参数列表的标识符始终被解析为常量查找。

即使您定义了类似def Foo "You won't see this" end. 当它遇到 时Foo,它仍然会尝试查找常量Foo并在找不到该名称的常量时抛出 NameError 。为了调用以大写字母开头的方法,您必须包含一个明确的接收者(例如self.Foo)或一个参数列表(如果只有一个空的)。

于 2014-05-07T00:44:13.593 回答