__FILE__在使用binding.pry时返回不同的值



__FILE__返回当前Ruby脚本文件的路径。

一个潜在的重要问题是,如果使用binding.pry,则__FILE__评估为(pry)。根据是否在binding.pry的上下文中对__FILE__进行评估,使其评估为不同的值是潜在的问题。例如,

$stdout.print "****************************************nn"
$stdout.print "FILE: #{__FILE__}nn"
$stdout.print "****************************************nn"
binding.pry

当脚本在binding.pry处暂停时,我得到:

__FILE__
# >> (pry)

有人知道即使在binding.pry的上下文中也可以获得当前文件的路径的机制吗?

使用_file_而不是__FILE__。例如,给定两个文件:

# foo.rb
require 'pry'
require './bar'
binding.pry
b = Bar.new

和:

# bar.rb
require 'pry'
class Bar
def initialize
binding.pry
end
end

使用ruby foo.rb:运行它们

ruby foo.rb
From: /Users/username/foo.rb @ line 3 :
1:     require 'pry'
2:     require './bar'
=> 3:     binding.pry
4:     b = Bar.new
(main):1 ⇒ _file_
=> "/Users/username/foo.rb"
(main):2 ⇒ exit
From: /Users/username/bar.rb @ line 4 Bar#initialize:
3: def initialize
=> 4:   binding.pry
5: end
(#<Bar:0x00007fbb6caaff08>):1 ⇒ _file_
=> "/Users/username/bar.rb"

在CCD_ 13中可以找到CCD_。

Sergio Tulentsev提出了一个简单的建议,在调用binding.pry之前将__FILE__分配给一个变量。

anothermh,提到了可用于捆绑撬的CCD_ 16。

最后,我把两个答案结合起来:

# When in the context of binding.pry, __FILE__ resolves to '(pry)',
# binding contains the local variable _file_ which always resolves to
# the current file, even when being evaluated in the context of binding.pry .
# _file_ is only available, in binding. This does the trick:
current_file = __FILE__.downcase == '(pry)' ? _file_ : __FILE__

最新更新