ruby - 为什么调用 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 解释器遇到一行pp pp
时,它需要解析两个标记。第一个显然是一个方法,因为它需要一个参数,另一个可以是方法或局部变量(没有括号也没有参数)。
因此,在执行期间,ruby 将从第二个令牌开始解析。当不清楚 token 是指变量还是方法时,ruby 总是首先搜索变量。pp
在这种情况下,当您为创建局部变量(假设 by )分配一个值时,该变量就在那里pp = 1
。
然后 ruby 仍然要处理第二个令牌,但现在看起来像pp(1)
(因为第一个令牌已经被解析)。在这种情况下,这显然是一种方法,因此 ruby 只是向(在这种情况下是(主)对象)发送pp
消息。self
方法pp
是在内核上定义的,因此每个对象(包括)(main)
都可以访问它。
这里的关键是要了解您没有覆盖方法pp
- 该方法仍然存在。唯一发生的是pp
令牌的不同分辨率。即使pp
被局部变量隐藏(或隐藏),您仍然可以通过使用显式self.pp
或确保它看起来像一个方法来调用它pp()
推荐阅读
- fortran - 英特尔 Fortran 和 gfortran 之间的未格式化文件写入/读取兼容性问题
- python-3.x - 具有嵌套列表值的字典到单个值列表
- tensorflow - Tensorflow:FailedPreconditionError:从容器读取资源变量时出错:localhost。在自定义损失函数上运行 sess.run() 时
- azure - 在 Azure Functions 中使用 Azure 应用程序配置的功能标志
- javascript - react-native-video 同时播放单独的视频和音轨?
- javascript - 如何在javascript中声明与类名中的属性同名的函数?
- python - 如何创建具有多级列的 DataFrame?
- parse-platform - 使用 setTimeout() 安排推送
- java - 使用 PDF BOX 库绘制具有背景颜色的图像
- php - 如何在php中制作动态表头