为什么Pry格式化这些返回值的方式不同?

时间:2016-02-13 21:58:28

标签: ruby location proc

在下面的第一个声明中,Pry返回一个看起来很正常的对象。

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

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

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

2 个答案:

答案 0 :(得分:2)

第二个例子是文字,并且在Ruby代码中创建了proc(lambda),它获取源位置。

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

{}.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:0x007f387602af70@(irb):2>

答案 1 :(得分:1)

这与Pry没有任何关系。这就是你在这两个程序上调用inspect时得到的结果。

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

在第一个例子中,没有阻止。您在空哈希上调用Hash#to_proc(这是不相关的;您使用Symbol#to_proc等获得了相同的结果),因此没有代码可以将行号与;一个行号甚至不会有意义。

顺便说一句,你可以在proc.cproc_to_s函数中查看这种情况。