如果我為變數賦值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
uj5u.com熱心網友回復:
Ruby 是一種解釋型語言,這意味著它不是編譯,而是按照撰寫的方式執行代碼,逐行、逐字(或者更確切地說是逐字逐句)解釋代碼。
當 ruby?? 解釋器遇到 line 時pp pp,它需要決議兩個標記。第一個顯然是一個方法,因為它需要一個引數,另一個可以是方法或區域變數(沒有括號也沒有引數)。
因此,在執行期間,ruby 將從第二個令牌開始決議。當不清楚 token 是表示變數還是方法時,ruby 總是先搜索變數。在這種情況下,當您為pp創建區域變數分配一個值時,變數就在那里(比方說 by pp = 1)。
然后 ruby?? 仍然要處理第二個令牌,但現在看起來像pp(1)(因為第一個令牌已經解決了)。在這種情況下,這顯然是一個方法,因此 ruby?? 只是向(在這種情況下是(主)物件)發送pp訊息self。方法pp是在內核上定義的,所以每個物件——包括(main)可以訪問它。
這里的關鍵是要了解您沒有覆寫方法pp- 該方法仍然存在。唯一發生的事情是pp令牌的不同解析度。即使pp被區域變數隱藏(或隱藏),您仍然可以通過使用顯式self.pp或確保它看起來像一個方法來呼叫它pp()
uj5u.com熱心網友回復:
我在這里走得很遠(主要是為了好玩)并猜測你會做這樣的事情
>> 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 等等......
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/321206.html
標籤:红宝石
