if __FILE__ == $0
$:.unshift File.join(File.dirname(__FILE__),'..')
Я нашел этот код в Ruby, какой смысл?
if __FILE__ == $0
$:.unshift File.join(File.dirname(__FILE__),'..')
Я нашел этот код в Ruby, какой смысл?
# Only run the following code when this file is the main file being run
# instead of having been required or loaded by another file
if __FILE__==$0
# Find the parent directory of this file and add it to the front
# of the list of locations to look in when using require
$:.unshift File.expand_path("../../", __FILE__)
end
Обратите внимание, что эта конкретная практика (добавление в каталог LOAD_PATH) обычно не требуется с появлением require_relative
, а expand_path
- это более простой способ найти родительский каталог.
Это означает:
Условная часть может быть полезна для многих вещей. Файл Ruby может быть написан для обеспечения функциональности большой программы, но также доступен (с дополнительным кодом) как script. Альтернативно, script -form может запускать тесты модуля, тогда как компонентная компонента реализует некоторый класс для более крупной программы и вызывает тесты только в том случае, если они ссылаются по имени.
Предполагаемый путь имеет некоторые общие цели, помимо очевидного нахождения частных включений. Если у вас есть несколько разных версий или выпусков чего-либо, таким образом, любой сопутствующий "исполняемый файл" (скрипты) получит предпочтительный вызов./usr/local/release232/bin/все будет запускать все из одного и того же каталога bin, даже если release220 ранее по умолчанию.
Отличное объяснение того, что/почему с ruby-lang.org:
__FILE__
- это волшебная переменная, которая содержит имя текущего файла.$0
- это имя файла, используемого для запуска программы. Эта проверка говорит: "Если это основной файл, который используется..." . Это позволяет использовать файл как библиотеку, а не выполнять код в этом контексте, но если файл используется как исполняемый файл, затем выполните этот код.
Смотрите: https://www.ruby-lang.org/en/documentation/quickstart/4/
Ruby, как и любой язык, имеет несколько зарезервированных ключевых слов, включая if
, return
, class
; одним из них является __FILE__
. Ruby использует __FILE__
для хранения текущего имени исходного файла.
Добавленный $
в имени переменной указывает глобальную переменную. В этом случае $0
содержит имя выполняемого script. Например, если вы запустите ruby hello_world.rb
, значение $0
будет hello_world.rb
if __FILE__ == $0
...
end
Теперь код внутри оператора if будет выполняться только в том случае, если файл, содержащий исходный код, является тем же файлом, который вы выполняете. Для лучшего объяснения создайте 2 файла.
Сначала hello_world.rb
:
# hello_world
puts "Hello world"
и второй hello_pluto.rb
:
# hello_pluto
require_relative "hello_world"
puts "Hello Pluto"
Здесь, если вы запустите ruby hello_world.rb
, он просто выведет:
Hello world
Теперь, если вы запустите ruby hello_pluto.rb
, он выведет:
Hello world
Hello Pluto
Он также запускает файл hello_world. Теперь вставьте код из hello_world внутри оператора if и снова запустите hello_pluto:
# hello_world
if __FILE__ == $0
puts "Hello world"
end
Как и ожидалось, единственное, что вы видите, это Hello Pluto
. Таким образом, оператор if гарантирует, что любой код, который находится внутри оператора, будет выполняться только в том случае, если исходный файл совпадает с запущенным script.
Ссылка: http://periclestheo.com/2014/02/what-is-up-with- ФАЙЛ - и - $0.html
это означает, что если файл был запущен напрямую, не требуется или загружен, добавьте родительский каталог сценариев в $LOAD_PATH (путь, где поиск ruby для требуемых файлов() d)
Я рекомендую использовать псевдоним $PROGRAM_NAME
над $0
, так как его немного понятно, что вы имеете в виду, когда используете его, - они означают одно и то же.
Теперь, что означает $PROGRAM_NAME
/$0
? Из документов Ruby:
$0
Содержит имя выполняемого script. Может быть назначено.
Давайте продемонстрируем, как это работает с кодом.
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
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__
- это идиома, которую многие разработчики используют, чтобы сказать "только выполнить этот код, если вы выполняете этот файл по отдельности".
Какой код вы бы обернули в этом условном выражении? Я часто использую его, чтобы продемонстрировать, как использовать модуль. Это также очень удобно выполнять этот файл изолированно, чтобы убедиться, что он работает вне контекста более крупной программы, которую вы можете писать.
Если вы не обернули свой примерный код в этом условном выражении, тогда он будет выполняться всякий раз, когда файл требуется/загружен в жизненном цикле вашей более крупной программы, что почти наверняка не то, что вы хотите.