如果我给变量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
创建一个局部变量(假设通过pp = 1
)时,该变量就在那里。
然后ruby仍然需要处理第二个令牌,但现在看起来像pp(1)
(因为第一个令牌已经被解析了)。在这种情况下,这显然是一个方法,所以ruby只是将pp
消息发送给self
(在这个上下文中是(main)对象)。方法pp
是在内核上定义的,所以包括(main)
在内的每个对象都可以访问它。
这里的关键是要理解您没有覆盖方法pp
-该方法仍然存在。唯一发生的事情是pp
令牌的分辨率不同。即使pp
被局部变量隐藏(或遮蔽),您仍然可以通过使用显式self.pp
或确保它看起来像pp()
方法来调用它
我猜你会做这样的事情(主要是为了好玩)
>> pp "this is a test"
"this is a test"
=> "this is a test"
>> pp = pp
=> nil
>> pp pp
nil
=> nil
>> pp "this is another test"
"this is another test"
=> "this is another test"
结果是这样的
pp = pp
你已经创建了一个局部变量pp
,它被分配了一个pp
方法返回的值(在本例中是nil
)
>> pp pp
这里你调用pp
方法并传递pp
变量,它保存着nil
>> pp "this is another test"
"this is another test"
=> "this is another test"
您仍然可以像往常一样调用pp
方法。
不知道为什么你希望它循环。表达式是求值的(一般是从右到左),所以它们最终会求值。通常不应该发生无限循环。举个例子:
x = y = z = x
它将首先计算最右边的x
(没有定义,所以默认为nil
,所以下一步概念上将是:
x = y = z = nil
将nil赋值给z,计算结果也是nil
x = y = nil
将nil赋值给y等等…