Подтвердить что ты не робот

Что означает `if __FILE__ == $0` в Ruby

if __FILE__ == $0
  $:.unshift File.join(File.dirname(__FILE__),'..')

Я нашел этот код в Ruby, какой смысл?

4b9b3361

Ответ 1

# 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 - это более простой способ найти родительский каталог.

Ответ 2

Это пара Ruby Mini-Design-Patterns

Это означает:

  • Если файл выполняется непосредственно, т.е. как script,
  • Затем найдите каталог, в котором находится script, и добавьте его в начало пути поиска/требуемого поиска

Условная часть может быть полезна для многих вещей. Файл Ruby может быть написан для обеспечения функциональности большой программы, но также доступен (с дополнительным кодом) как script. Альтернативно, script -form может запускать тесты модуля, тогда как компонентная компонента реализует некоторый класс для более крупной программы и вызывает тесты только в том случае, если они ссылаются по имени.

Предполагаемый путь имеет некоторые общие цели, помимо очевидного нахождения частных включений. Если у вас есть несколько разных версий или выпусков чего-либо, таким образом, любой сопутствующий "исполняемый файл" (скрипты) получит предпочтительный вызов./usr/local/release232/bin/все будет запускать все из одного и того же каталога bin, даже если release220 ранее по умолчанию.

Ответ 3

Отличное объяснение того, что/почему с ruby-lang.org:

__FILE__ - это волшебная переменная, которая содержит имя текущего файла. $0 - это имя файла, используемого для запуска программы. Эта проверка говорит: "Если это основной файл, который используется..." . Это позволяет использовать файл как библиотеку, а не выполнять код в этом контексте, но если файл используется как исполняемый файл, затем выполните этот код.

Смотрите: https://www.ruby-lang.org/en/documentation/quickstart/4/

Ответ 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

Ответ 5

это означает, что если файл был запущен напрямую, не требуется или загружен, добавьте родительский каталог сценариев в $LOAD_PATH (путь, где поиск ruby ​​для требуемых файлов() d)

Ответ 6

Я рекомендую использовать псевдоним $PROGRAM_NAME над $0, так как его немного понятно, что вы имеете в виду, когда используете его, - они означают одно и то же.

Теперь, что означает $PROGRAM_NAME/$0? Из документов Ruby:

$0
Содержит имя выполняемого script. Может быть назначено.

Давайте продемонстрируем, как это работает с кодом.

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. Создание файла Rakefile

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__ - это идиома, которую многие разработчики используют, чтобы сказать "только выполнить этот код, если вы выполняете этот файл по отдельности".

Какой код вы бы обернули в этом условном выражении? Я часто использую его, чтобы продемонстрировать, как использовать модуль. Это также очень удобно выполнять этот файл изолированно, чтобы убедиться, что он работает вне контекста более крупной программы, которую вы можете писать.

Если вы не обернули свой примерный код в этом условном выражении, тогда он будет выполняться всякий раз, когда файл требуется/загружен в жизненном цикле вашей более крупной программы, что почти наверняка не то, что вы хотите.