首页 > 解决方案 > 为什么调用 pp pp 不循环?

问题描述

如果我为变量赋值pp,然后pp pp在控制台中调用,为什么不漂亮的打印循环?

$ irb

pp = "hello world"
=> "hello world" 
pp pp
"hello world"
=> "hello world" 

根据这个解释,我认为应该

https://blog.brycekerley.net/2014/08/27/Working-with-pp-the-Ruby-Pretty-Printer.html

编辑:我并不是说它必须循环,我只是想知道发生的阻止它循环的方法调用顺序。

标签: ruby

解决方案


Ruby 是一种解释型语言,这意味着它不是编译,而是按编写的代码执行代码,逐行、逐字(或者更确切地说逐个标记)解释代码。

当 ruby​​ 解释器遇到一行pp pp时,它需要解析两个标记。第一个显然是一个方法,因为它需要一个参数,另一个可以是方法或局部变量(没有括号也没有参数)。

因此,在执行期间,ruby 将从第二个令牌开始解析。当不清楚 token 是指变量还是方法时,ruby 总是首先搜索变量pp在这种情况下,当您为创建局部变量(假设 by )分配一个值时,该变量就在那里pp = 1

然后 ruby​​ 仍然要处理第二个令牌,但现在看起来像pp(1)(因为第一个令牌已经被解析)。在这种情况下,这显然是一种方法,因此 ruby​​ 只是向(在这种情况下是(主)对象)发送pp消息。self方法pp是在内核上定义的,因此每个对象(包括)(main)都可以访问它。

这里的关键是要了解您没有覆盖方法pp- 该方法仍然存在。唯一发生的是pp令牌的不同分辨率。即使pp被局部变量隐藏(或隐藏),您仍然可以通过使用显式self.pp或确保它看起来像一个方法来调用它pp()


推荐阅读