Один и тот же код загрузки завершается неудачно или успешно в зависимости от того, откуда вы его запускаете? - PullRequest
0 голосов
/ 04 марта 2020

Не могли бы вы уточнить это предложение для меня из "Ruby языка программирования" Фланагана и Мацумото: "Если файл для загрузки указан с абсолютным путем или относительно ~ (домашний каталог пользователя ), то указанный файл c загружен. " Следуя этой идее, я попытался загрузить ~ / loadee.rb из ~ / projects / loader.rb, поскольку "файл для загрузки ... относится к ~". ~ / projects / loader.rb содержит:

puts "First line in ~/projects/loader.rb"
load 'loadee.rb'
puts "Back to ~/projects/loader.rb"

loadee.rb содержит:

puts "Contributed by ~/loadee.rb"

Мой вопрос: почему происходит сбой с ошибкой «не удается загрузить такой файл - loadee. rb ", когда я запускаю его так:

~/projects$ ruby loader.rb

Кроме того, я обнаружил, что даже без изменения чего-либо в загрузке файла происходит успешно, если вы запустите его так:

~$ ruby projects/loader.rb

Другое вопросы, которые я просматривал на эту тему, не прояснили И они сильно перегружены обращением к тому, как это соответствует той же технике в других языках, таких как C. Ruby - мой первый язык, и я был бы более озадачен такими обзорами других языков.

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Думаю, я понял это. Это не так просто, как может показаться.

Прежде всего, ruby проверяет, находится ли loadee.rb в том же каталоге, что и loader.rb. Если это метод загрузки, за которым следует голое имя плюс точка плюс расширение. Но вы также можете указать абсолютный путь.

Во-вторых, loadee.rb может находиться в каталоге, отличном от каталога loader.rb. В этом случае вызов load принимает аргумент в форме относительного пути.

И, в-третьих, файл loadee.rb можно загрузить, даже если он находится в другой папке, отличной от папки loader.rb, и вы не указали относительный путь - только пустое имя файла плюс точка плюс точка rb расширение. Но для этого вам нужно переключиться на каталог, в котором находится loadee.rb, и сделать его текущим рабочим каталогом. Таким образом ruby подберет его и будет использовать. Однако есть одна вещь, на которую стоит обратить внимание. Вы можете легко отклонить ruby от этого сценария, если переоцените его. А именно, если вы сделаете и то и другое: укажите относительный путь и сделайте каталог loadee.rb текущим рабочим каталогом в терминале, и все это не сможет загрузиться.

0 голосов
/ 04 марта 2020

Поскольку Ruby ссылается не на текущий путь, а на Ruby s $LOAD_PATH:

irb(main)> $LOAD_PATH

, вероятно, путь ~/projects зарегистрирован на $LOAD_PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...