在下面的第一个声明中,Pry返回一个看起来很正常的对象。
在第二个中,Pry指定对象中的lambda,但也添加@(pry)
,引用Pry会话内的行(:37
)。为什么第一个返回值包含@(pry)
?或者,相反,为什么第二个返回值包含它?
{}.to_proc
# => #<Proc:0x9b3fed0>
lambda {}
# => #<Proc:0x97db9c4@(pry):37 (lambda)>
答案 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.c
的proc_to_s
函数中查看这种情况。