加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 为什么方法调用在原则上可以是常量时需要消除歧义?

发布时间:2020-12-16 23:00:27 所属栏目:百科 来源:网络整理
导读:方法调用通常可以省略接收器和参数的括号: def foo; "foo" endfoo # = "foo" 在上面的例子中,foo在方法调用和对潜在局部变量的引用之间是不明确的.在没有后者的情况下,它被解释为方法调用. 但是,当方法名称原则上可以是常量名称时(即,当它以大写字母开头,并
方法调用通常可以省略接收器和参数的括号:
def foo; "foo" end
foo # => "foo"

在上面的例子中,foo在方法调用和对潜在局部变量的引用之间是不明确的.在没有后者的情况下,它被解释为方法调用.

但是,当方法名称原则上可以是常量名称时(即,当它以大写字母开头,并且仅由字母组成时),它似乎需要消除歧义.

def Foo; "Foo" end
Foo # => NameError: uninitialized constant Foo
Foo() # => "Foo"
self.Foo # => "Foo"

为什么会这样?为什么即使没有具有相同名称的常量,也需要明确区分方法调用与对常量的引用?

解决方法

在程序中任何给定点的范围内的局部变量集是词法定义的,因此可以静态地确定,甚至早在解析时间.因此,Ruby甚至在运行时之前就知道哪些局部变量在范围内,因此可以区分消息发送和局部变量解除引用.

首先通过词法查找常量,然后通过继承,即动态地查找常量.在运行时之前,不知道哪些常量在范围内.因此,为了消除歧义,Ruby总是假设它是一个常量,除非显然不是,即它需要参数或有接收器或两者兼而有之.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读