未检测到Upcased方法

时间:2014-10-20 11:03:45

标签: ruby methods

以下定义了一个具有upcased名称的方法,并试图调用它,但失败了:

class Module
  def Foo; puts "foo" end
end

class A
  Foo
end
# => uninitialized constant A::Foo

我知道存在一个具有相同名称的常量将优先于方法查找,但在这种情况下没有这样的常量。

如果我将其作为方法消除歧义,则会检测到该方法:

class A
  Foo()
end
# => foo

当方法名称没有升级时,查找不会失败。

class Module
  def foo; puts "foo" end
end

class A
  foo
end
# => foo

为什么方法查找会因模糊的upcased方法而失败?

1 个答案:

答案 0 :(得分:3)

Ruby具有灵活的消息发送语法。特别是,你可以离开接收器,你可以不用参数列表。如果同时执行这两种操作,那么这种无接收器无参数消息发送在语法上与变量解引用无法区分。

因此,我们需要一些规则来消除无接收无参数消息发送和变量解引用之间的歧义。这些规则很简单:

  • 例如变量,类变量和全局变量,没有歧义
  • 对于局部变量,这样的构造总是被解释为消息发送,除非局部变量在范围内,然后它被解释为变量解引用
  • 对于常量,它始终被解释为变量解除引用

由于只有在发送无接收器无参数消息时才会出现这种模糊性,因此可以通过添加接收器或参数列表轻松解决此问题。