Я рекомендую вам использовать $PROGRAM_NAME
псевдоним над $0
, поскольку немного яснее, что вы имеете в виду, когда используете его - они означают одно и то же.
Теперь, что означает $PROGRAM_NAME
/ $0
? Из рубиновых документов :
$ 0
Содержит имя исполняемого скрипта. Может быть назначено.
Давайте покажем, как это работает с кодом.
1. Создать hello.rb
module Hello
def self.world
puts "Hello, world!"
puts "$0 = #{$0}"
puts "__FILE__ = #{__FILE__}"
end
end
if $PROGRAM_NAME == __FILE__
puts Hello.world
end
Посмотрите, что произойдет, если вы запустите этот файл сам по себе:
$ ruby hello.rb
Hello, world!
$0 = hello.rb
__FILE__ = hello.rb
2. Создать рейкфайл
require 'rake'
require_relative 'hello'
task :hello do
Hello.world
end
Теперь выполните этот же код из контекста задачи Rake:
$ rake hello
Hello, world!
$0 = /Users/sean/.rbenv/versions/2.3.0/bin/rake
__FILE__ = /Users/sean/Projects/hello/hello.rb
Заключение кода в конец файла Ruby в условном выражении if $PROGRAM_NAME == __FILE__
- это идиома, которую многие разработчики используют, чтобы сказать: «Выполняйте этот код, только если вы запускаете этот файл по отдельности».
Какой код вы бы добавили в это условие? Я часто использую его, чтобы продемонстрировать, как использовать модуль. Это также делает очень удобным выполнение этого файла изолированно, чтобы убедиться, что он работает вне контекста более крупной программы, которую вы, возможно, пишете.
Если вы не заключили пример кода в это условие, то он будет выполняться всякий раз, когда файл требуется / загружается в жизненном цикле вашей более крупной программы, что почти наверняка не то, что вам нужно.