Требование файла или библиотеки в Ruby
В этой статье мы рассмотрим следующие темы:
- разница между абсолютным и относительным путем
- метод
Kernel#require
- метод
Kernel#require_relative
Прежде, чем начать
Позвольте мне представить здесь платформу, которая помогла мне изучить большую часть моих знаний о Ruby. Действительно, Pluralsight - потрясающая платформа.
С 50+ курсами, которые охватывают различные темы по Ruby и Ruby on Rails, это лучший способ поднять свои знания на новый уровень!
Попробуйте бесплатно 👇😉
Спасибо за уделенное время!
Абсолютный путь против относительного пути
Абсолютный путь - это полный путь, который указывает на одно и то же место независимо от положения текущего каталога.
$> tree . ├── file1.txt ├── directory/ │ └── file2.txt ├── another_directory/ │ └── file3.txt 2 directories, 3 files $> pwd /Users/mehdi/path
Давайте cat
file3.txt
файл, используя абсолютный путь
$> cat /Users/mehdi/path/another_directory/file3.txt I'm the file #3 $> cd directory && pwd /Users/mehdi/path/directory $> cat /Users/mehdi/path/another_directory/file3.txt I'm the file #3
Сначала мы cat
file3.txt
файл, используя абсолютный путь.
Затем мы переходим в подпапку directory
.
Наконец, мы видим, что вызов cat
с абсолютным путем отобразит содержимое файла file3.txt
независимо от положения текущего каталога.
Напротив, относительный путь начинается с текущего рабочего каталога.
$> cat another_directory/file3.txt I'm the file #3 $> cd directory && pwd /Users/mehdi/path/directory $> cat ../another_directory/file3.txt I'm the file #3
Здесь мы cat
file3.txt
файл, используя относительный путь.
После переходим в папку directory
.
Затем мы видим, что вызов cat
с относительным путем - включая префикс ../
для перехода в предыдущий каталог - отобразит содержимое файла относительно позиции текущего каталога.
Метод Kernel # require
Метод Kernel#require
загружает файл или библиотеку, переданную в качестве параметра.
Этот метод ожидает, что аргумент включает абсолютный путь.
В противном случае метод пытается найти файл или библиотеку, добавляя к нему каждый путь, включенный в глобальную переменную $LOAD_PATH
- или с текущим путем к рабочему каталогу, если ./
добавляет аргумент, переданный методу require
.
Когда файл или библиотека загружаются, абсолютный путь добавляется в глобальный массив $LOADED_FEATURES
.
Глобальный массив $LOADED_FEATURES
используется для проверки, требуется ли уже файл или библиотека (также известная как функция). В этом случае файл или библиотека не загружаются снова, и метод Kernel#require
возвращает false
.
Давайте посмотрим на следующий пример, чтобы подробно описать поведение этого метода.
$> tree . ├── hello.rb 0 directories, 1 file
Итак, давайте попробуем потребовать hello.rb
в скрипте в том же каталоге
Здесь мы передаем аргумент ./hello.rb
в require
. Поскольку перед аргументом стоит ./
, тогда require
определяет абсолютный путь на основе текущего рабочего каталога.
Когда файл загружен, определенный абсолютный путь добавляется к глобальному массиву $LOADED_FEATURES
.
Наконец, поскольку файл hello.rb
включен в массив $LOADED_FEATURES
, второй вызов require './hello.rb'
возвращает false
.
А теперь давайте попробуем require
жемчужину rake
Здесь мы передаем аргумент rake
в require
. В этом случае require
проверяет каждый абсолютный путь, включенный в глобальный массив $LOAD_PATH
.
Если путь совпадает, библиотека загружается, и путь добавляется в массив $LOADED_FEATURES
.
Наконец, поскольку библиотека rake
включена в массив $LOADED_FEATURES
, второй вызов require 'rake'
возвращает false
.
метод require_relative
Метод Kernel#require_relative
загружает файл или библиотеку, переданную в качестве параметра.
Сначала он находит требуемый путь к файлу или библиотеке, а затем определяет абсолютный путь в соответствии с требуемым файлом или библиотекой.
Когда файл или библиотека загружены, абсолютный путь добавляется к $LOADED_FEATURES
.
Попробуем потребовать hello.rb
файл с помощью метода Kernel#require_relative
Этот сценарий запускается в том же каталоге, что и наш hello.rb
файл.
Текущий путь к сценарию - /Users/mehdi/require/
.
Таким образом, метод require_relative
добавляет путь, переданный в качестве аргумента, и определяет абсолютный путь.
В этом случае окончательный абсолютный путь - /Users/mehdi/require/hello.rb
.
Если этот путь существует, то абсолютный путь будет добавлен в массив $LOADED_FEATURES
.
Не стесняйтесь читать
Loading a file in Ruby
статью .
Вуаля!
Спасибо, что нашли время прочитать этот пост :-)
Не стесняйтесь 👏 и поделитесь этим постом на Medium, если он был вам полезен.
Вот ссылка на мой последний средний пост: Ruby: instance_eval
.