2016-02-13 24 views
2

在下面的第一條語句中,Pry返回了一個看起來很正常的對象。爲什麼Pry以不同的方式格式化這些返回值?

在第二,撬指定對象的λ,而且還增加了與@(pry)到撬會話(:37)內的線的基準。爲什麼第一個返回值不包含@(pry)?或者,相反,爲什麼第二個返回值包含它?

{}.to_proc 
# => #<Proc:0x9b3fed0> 

lambda {} 
# => #<Proc:[email protected](pry):37 (lambda)> 

回答

2

第二個例子是一個文字,和proc(拉姆達)的Ruby代碼,它得到的源位置中創建那裏。

在第一個例子中,PROC通過執行C法(to_proc)創建。 C代碼被編譯到Ruby解釋器中,該解釋器變成二進制代碼,並且用C位置來代替Ruby源位置是沒有意義的。事實上,你也不會得到該方法的源位置(這是不一樣的,因爲它產生的PROC的「源位置」,而應該是接近它,如果他們被給予):

{}.method(:to_proc).source_location # => nil 

但是,如果源寫成的Ruby代碼的一部分,你得到的源位置:

irb(main):001:0> def to_proc 
irb(main):002:1> Proc.new{} 
irb(main):003:1> end 
=> :to_proc 
irb(main):004:0> {}.to_proc 
=> #<Proc:[email protected](irb):2> 
1

這和Pry沒有任何關係。這是您在這兩個Proc上致電inspect時所得到的結果。

我不是100%肯定,但我有一個理論。在第二個示例中,您將一個塊傳遞給lambda。儘管塊中沒有任何代碼,但通常情況下,調試時(通常用於這種情況的行號)非常重要。

在第一個例子,雖然,有沒有塊。你在一個空的哈希上調用Hash#to_proc(這是無關的;你得到的結果與Symbol#to_proc等一樣),所以沒有代碼將一個行號關聯起來;一個行號甚至不會有意義。

你可以看到這種情況發生在proc_to_s功能proc.c,順便說一句。

相關問題