在下面的第一條語句中,Pry返回了一個看起來很正常的對象。爲什麼Pry以不同的方式格式化這些返回值?
在第二,撬指定對象的λ,而且還增加了與@(pry)
到撬會話(:37
)內的線的基準。爲什麼第一個返回值不包含@(pry)
?或者,相反,爲什麼第二個返回值包含它?
{}.to_proc
# => #<Proc:0x9b3fed0>
lambda {}
# => #<Proc:[email protected](pry):37 (lambda)>
在下面的第一條語句中,Pry返回了一個看起來很正常的對象。爲什麼Pry以不同的方式格式化這些返回值?
在第二,撬指定對象的λ,而且還增加了與@(pry)
到撬會話(:37
)內的線的基準。爲什麼第一個返回值不包含@(pry)
?或者,相反,爲什麼第二個返回值包含它?
{}.to_proc
# => #<Proc:0x9b3fed0>
lambda {}
# => #<Proc:[email protected](pry):37 (lambda)>
第二個例子是一個文字,和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>
這和Pry沒有任何關係。這是您在這兩個Proc上致電inspect
時所得到的結果。
我不是100%肯定,但我有一個理論。在第二個示例中,您將一個塊傳遞給lambda
。儘管塊中沒有任何代碼,但通常情況下,調試時(通常用於這種情況的行號)非常重要。
在第一個例子,雖然,有沒有塊。你在一個空的哈希上調用Hash#to_proc
(這是無關的;你得到的結果與Symbol#to_proc
等一樣),所以沒有代碼將一個行號關聯起來;一個行號甚至不會有意義。
你可以看到這種情況發生在proc_to_s
功能proc.c
,順便說一句。