为什么调用pp pp不循环?

  • 本文关键字:pp 循环 调用 ruby
  • 更新时间 :
  • 英文 :


如果我给变量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等等…

相关内容

  • 没有找到相关文章

最新更新