Требование файла или библиотеки в 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.