Ruby 为什么Pry对这些返回值的格式不同?

Ruby 为什么Pry对这些返回值的格式不同?,ruby,location,proc,Ruby,Location,Proc,在下面的第一条语句中,Pry返回一个外观正常的对象 在第二个示例中,Pry在对象中指定lambda,但也添加了对Pry会话中的行的引用(:37)。为什么第一个返回值不包含@(pry)?或者,相反,为什么第二个返回值包含它 {}.to_proc # => #<Proc:0x9b3fed0> lambda {} # => #<Proc:0x97db9c4@(pry):37 (lambda)> {}.to_proc # => # lambda{} # => #

在下面的第一条语句中,Pry返回一个外观正常的对象

在第二个示例中,Pry在对象中指定lambda,但也添加了对Pry会话中的行的引用(
:37
)。为什么第一个返回值不包含
@(pry)
?或者,相反,为什么第二个返回值包含它

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

lambda {}
# => #<Proc:0x97db9c4@(pry):37 (lambda)>
{}.to_proc
# => #
lambda{}
# => #

这与Pry无关。这是在这两个过程中调用
inspect
时得到的结果

我不是100%肯定,但我有一个理论。在第二个示例中,将一个块传递给
lambda
。虽然块中没有任何代码,但通常会有,并且在调试时(通常使用
inspect
进行调试),行号很重要

但是,在第一个示例中,没有阻塞。您正在空哈希上调用
Hash#to_proc
(这是不相关的;您得到的结果与
Symbol#to_proc
等相同),因此没有代码与行号关联;行号根本没有意义


顺便说一句,您可以在中的
proc\u to_s
函数中看到这种情况发生的地方。

第二个示例是一个文本,并且在Ruby代码中创建了proc(lambda),它从中获取源位置

在第一个示例中,通过执行C方法(
to_proc
)创建proc。C代码被编译成Ruby解释器,解释器变成二进制代码,用C位置代替Ruby源位置是没有意义的。事实上,您也不会获得该方法的源位置(与它生成的proc的“源位置”不同,但如果要给出它们,则应该靠近它):

但是,如果源代码是作为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:0x007f387602af70@(irb):2>
irb(main):001:0>def to_proc
irb(主):002:1>程序新建{}
irb(主):003:1>结束
=>:to_proc
irb(主):004:0>{}.to_proc
=> #
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:0x007f387602af70@(irb):2>