Ruby 为什么Pry对这些返回值的格式不同?
在下面的第一条语句中,Pry返回一个外观正常的对象 在第二个示例中,Pry在对象中指定lambda,但也添加了对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{} # => #
: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>