为什么 Pry 以不同的方式格式化这些 return 值?

Why does Pry format these return values differently?

在下面的第一个陈述中,Pry return是一个看起来很正常的对象。

在第二个中,Pry 在对象中指定了一个 lambda,但还添加了 @(pry) 并引用了 Pry 会话中的行 (:37)。为什么第一个 return 值不包含 @(pry)?或者,反过来,为什么第二个 return 值包含它?

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

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

这与Pry无关。这就是你在这两个 Procs 上调用 inspect 时得到的结果。

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

不过,在第一个示例中,没有任何块。您在空 Hash 上调用 Hash#to_proc(这是不相关的;您会得到与 Symbol#to_proc 等相同的结果),因此没有代码将行号与之关联;行号甚至没有意义。

顺便说一句,你可以在proc.c中的proc_to_s函数中看到发生这种情况的地方。

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

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

{}.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>