Ruby: Как получить правильный полный путь к исходному файлу после chdir?

См. следующий пример:

puts __FILE__                           #test.rb
puts File.expand_path(__FILE__)         #C:/TEMP/test.rb

Dir.chdir('..')
puts __FILE__                           #test.rb
puts File.expand_path(__FILE__)         #C:/test.rb

После (глобального) chdir expand_path возвращает неверный результат.

Как получить правильный результат?

Я попытался использовать второй параметр File.expand_path:

puts File.expand_path(__FILE__, 'temp') #C:/TEMP/test.rb
puts File.expand_path(__FILE__, 'c:/temp') #C:/TEMP/test.rb

Но чтобы использовать его, я должен знать путь __FILE__.

Кажется, что команда require_relative игнорирует все chdir-действия. Поэтому у меня есть надежда, что есть способ получить «настоящий» каталог файла.

Примечания:

  • Я знаю блочную версию Dir.chdir - для моей конкретной задачи я не могу ее использовать.
  • Мое фактическое решение: я сохраняю полный путь перед сменой каталога (я также могу сохранить Dir.pwd перед сменой каталога).

person knut    schedule 17.12.2013    source источник
comment
Не понимаю, каков ожидаемый результат. Не могли бы вы помочь?   -  person Arup Rakshit    schedule 17.12.2013
comment
@ArupRakshit Я ищу реальное местоположение моего исходного файла. В моем примере это c:/temp.   -  person knut    schedule 17.12.2013
comment
Проверьте это - ruby-doc.org/core -2.0.0/File.html#method-c-realdirpath , если это полезно.   -  person Arup Rakshit    schedule 17.12.2013
comment
почему нельзя сделать это перед родственником? И, вы сделали драгоценный камень?   -  person Малъ Скрылевъ    schedule 22.12.2013
comment
Я не использую require_relative в своем коде. Но когда я попытался решить свою проблему, я понял, что у require_relative нет проблем со сменой каталогов. Поэтому я подумал, что может быть решение.   -  person knut    schedule 22.12.2013


Ответы (1)


__FILE__ встроенный экземпляр класса String:

puts __FILE__.class 
# ⇒ String

Значит, не стоит ожидать от него никакой магии вуду. Он хранит относительный путь, по которому этот файл был загружен.

ruby C:\TEMP\test.rb        # ⇒ __FILE__ == 'C:\TEMP\test.rb'
cd C:\TEMP && ruby test.rb  # ⇒ __FILE__ == 'test.rb'

В ruby ​​2.0 была введена новая встроенная функция __dir__ . Это похоже на то, что вы ищете, если вас устраивает только 2.0 решение.

person Aleksei Matiushkin    schedule 17.12.2013