以下定义了一个具有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方法而失败?
答案 0 :(得分:3)
Ruby具有灵活的消息发送语法。特别是,你可以离开接收器,你可以不用参数列表。如果同时执行这两种操作,那么这种无接收器无参数消息发送在语法上与变量解引用无法区分。
因此,我们需要一些规则来消除无接收无参数消息发送和变量解引用之间的歧义。这些规则很简单:
由于只有在发送无接收器无参数消息时才会出现这种模糊性,因此可以通过添加接收器或参数列表轻松解决此问题。