cli_starter.rb
ссылается на Command1
в требуемое время, до того, как другие файлы были загружены: отдельный шаг разрешения отсутствует.
Дополнительные вызовы require_relative
гарантируют, что эти файлы загружаются первыми, поэтому ихконстанты доступны, пока загружается cli_starter.rb
.
Различные формы require
по существу эквивалентны вставке содержимого файла в этот момент в коде (если это еще не требуется).
Таким образом (в зависимости от порядка Dir[]
находит файлы из вашего глобуса), общее неудачное выполнение выглядит примерно так:
module MyThorCLI
class Base < Thor
Command1 ...
end
end
class Command1
end
Без отдельного шага разрешения это происходит, когдаон попадает в ссылку Command1
, потому что определение класса еще не встречалось - это несколько строк ниже.
Добавление этих требований - вполне разумное решение проблемы.Потенциально хитрый подход состоит в том, чтобы изменить содержимое cli_starter.rb
, чтобы оно не ссылалось на другие константы до позднего времени (помещая эти ссылки в вызываемые позднее методы, а не непосредственно в тело класса).Будет ли это возможно, зависит от того, что делает с ними ваш класс.
class Base ..
@@first_command = Command1 # this reference is evaluated when it's encountered
def first_command
@@first_command
end
# -->
class Base ..
def first_command
Command1 # this one is evaluated when the method is called
end