Непонятно, когда вы хотите, чтобы ваш код запускался. Вы хотите, чтобы он запускался, когда Ruby запускает программу, или когда Bundler строит список драгоценных камней для приложения?
Если вы говорите о том, когда Руби загружает код, чтобы запустить его ...
Рубин поддерживает BEGIN {...}
и END {...}
блоки, которые получают, прежде чем запускать переменные инициализируются. Они запускаются, как они видны, но, очевидно, END {...}
будет работать в конце программы непосредственно перед выходом переводчика.
См "Programming Ruby":
Начинайте и заканчивайте Блоки
Каждый рубин исходный файл может объявить блоки кода, который будет работать как файл загружается (Бегин блоков) и после завершения программы (блоки END).
BEGIN {
begin code
}
END {
end code
}
Программа может включать в себя несколько начинаются и заканчиваются блоки. Блоки BEGIN выполняются в том порядке, в котором они встречаются. Блоки END выполняются в обратном порядке.
Вы также можете добавить код в файл gem, class или module, который будет запущен при загрузке файла, чтобы инициализировать переменные/константы, которые динамически определяются. Для этого нет особых требований, просто не помещайте его в class
или def
. Код на главном уровне будет работать, как ожидалось, в том числе, если он находится в модуле - это важная часть «основного уровня».
Выполняйте любое из этих действий, потому что вы не хотите воздействовать на нагрузку или время выхода драгоценного камня, что отрицательно сказывается на программе.
Кроме того, будьте очень осторожны в отношении обезглавливания существующих классов в Ruby. Если вы измените функциональность существующего метода, вы можете сильно сломать приложение Ruby пользователя. Если вы добавите имя метода, которое конфликтует с именем, которое пользователь определил, тогда может возникнуть такая же ситуация, и в любом случае это может быть трудно отследить и исправить.
Выработать:
Когда Руби требует файл класса или модуль, он загружает его, а затем запускает код он находит там. Любые классы или константы инициализируются и запускается любой код на основном уровне. В нижней части файла Ruby перейдет к следующему запросу «require».
Рассмотрим файл, содержащий:
class Foo
def initialize
puts "Inside Foo.new()"
end
end
Running, что не будет возвращать ничего, и не будет ничего выполняться. Класс будет анализироваться, но поскольку ничего не вызывает Foo.new
, мы даже не видим выход. Вот почему мы не внедряем код, который мы хотим запустить автоматически внутри класса, потому что он не будет запускаться, если только это явно не вызывает его. Требование этого будет иметь тот же результат.
Изменение кода к следующему и работает он выводит «Inside Foo.new()»:
class Foo
def initialize
puts "Inside Foo.new()"
end
end
Foo.new()
# >> Inside Foo.new()
Это явным образом вызывая класс инициализатор.
Если первый код был необходим другому файлу, то при его запуске ничего не произойдет, потому что класс не вызывается до тех пор, пока что-то в требуемом коде или загруженный впоследствии файл не сообщит Ruby о его запуске. Имея класс инициализатор запустить результаты:
Inside Foo.new()
В любом случае, метод или определение класса не будет работать, пока он не вызывается foo
или Foo.new()
, который затем вызывает новый экземпляр будет определен, что позволяет инициализатору бежать.
Если ОП хочет что-то запустить в своем собственном драгоценном камне, поместить его внутрь def
или class
скроет его. Он должен быть на основном уровне для Ruby для запуска. И, опять же, это предполагает вопрос о запуске кода, когда Ruby загружает скрипт, а НЕ о коде Rubygems или Bundler может работать во время установки.
Трусливый лев хотел бы, чтобы вы уточнили: «Просто не кладите его в класс или модуль ...», но слишком боится спросить. –
"Трусливый лев"? В мире литературы и кино есть более одного персонажа под названием «Оловянный человек». Чтобы уточнить, что я сказал, я думаю, мне придется добавить пример кода для объяснения. –
CL утверждает, что его вопрос был общим, о запуске кода при загрузке скрипта и указывает, что вы можете вызывать методы класса во время создания класса (например, 'class Cat; def self.speak; p« Meow », ; end; speak; end => «Meow»). –