Ruby: абсолютный путь к файлу

ruby-absolute-pathДоброго времени. Наверное многие не раз замечали вот такой вызов метода: File.expand_path(‘../boot’, __FILE__), например в rails приложении в файле config/application.rb. Согласно документации, метод File::expand_path принимает в качестве первого аргумента путь и возвращает строку с его абсолютным значением. Например, пусть у нас есть файл code.rb в каталоге /home/helo/learning/ruby с таким содержимым:

path = File.expand_path(".")
p path

Перейдём в каталог /home/helo/learning/ruby и выполним наш файл:

ruby code.rb

В результате получаем строку: «/home/helo/learning/ruby». Это так, потому что File::expand_path вернул нам абсолютное значение переданного в аргументе пути (в данном случае «.»). Теперь поднимемся на два уровня выше до /home/helo и снова исполним тот же файл:

ruby learning/ruby/code.rb

Результат вернёт строку: «/home/helo». Идея в том, что File::expand_path возвращает абсолютный путь до аргумента относительно исполняемого каталога (того, где запускаем файл). Но что, если нам необходимо знать абсолютный путь до исполняемого файла вне зависимости от каталога, в котором мы его запускаем? В этом случае потребуется второй аргумент для File::expand_path. Его смысл — в точке отсчёта, относительно которой будет вычисляться абсолютное значение. Изменим содержимое code.rb:

path = File.expand_path(".", "/home/helo/learning/ruby")
p path

Теперь, из какого бы каталога мы не исполняли code.rb, в любом случае результат будет неизменен: «/home/psylone/learning/ruby». Обычно, в качестве второго аргумента передают ключевое слово __FILE__ которое вычисляется в относительный путь до файла (включая имя самого файла) относительно каталога из которого исполняется файл. Таким образом, изменив code.rb:

path = File.expand_path(".", __FILE__)
p path

получим в результате абсолютный путь: «/home/helo/learning/ruby/code.rb». Стоит заметить, что в отличие от предыдущих примеров текущий каталог «.» будет указывать на сам файл, поэтому его имя включается в результат. Если же мы хотим всегда получать абсолютный путь до каталога в котором находится code.rb, то делаем так:

path = File.expand_path("..", __FILE__)
p path

Теперь, откуда бы мы не исполняли code.rb, всегда будем получать результат: «/home/helo/learning/ruby». Этот механизм бывает полезен, например, если мы хотим включить какие-то файлы с помощью require, расположенные в других каталогах. В заключении стоит сказать, что первым аргументом помимо строки, File::expand_path способен принимать объект класса Pathname, что довольно здорово )

Реклама

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s