为什么 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>
在下面的第一个陈述中,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>