__FILE__ возвращает другое значение при использовании binding.pry
__FILE__
возвращает путь к текущему файлу скрипта Ruby.
Одна потенциально значимая проблема заключается в том, что при использовании binding.pry
, __FILE__
оценивает (pry)
, Это потенциально проблематично иметь __FILE__
оценивать различные значения в зависимости от того, оценивается ли это в контексте binding.pry
, Например,
$stdout.print "****************************************\n\n"
$stdout.print "FILE: #{__FILE__}\n\n"
$stdout.print "****************************************\n\n"
binding.pry
Когда сценарий останавливается на binding.pry
, Я получил:
__FILE__
# >> (pry)
Кто-нибудь знает какой-либо механизм, чтобы получить путь к текущему файлу, даже в контексте binding.pry
?
2 ответа
Использование _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"
_file_
и любые другие локальные имена переменных можно найти в binding.local_variables
,
Серхио Туленцев сделал простое предложение назначить __FILE__
в переменную перед вызовом binding.pry
,
упомянутое другое _file_
который доступен в привязке прай.
В итоге я объединил два ответа:
# 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__