Что означает __FILE__ == $PROGRAM_NAME в ruby?

Я наткнулся на этот синтаксис при рассмотрении кода в Ruby. Код является:

if __FILE__ == $PROGRAM_NAME
  #some code...
end

Я полагаю __FILE__ переменная, которая возвращает мне имя файла, в котором я нахожусь? Но что делает $PROGRAM_NAME символизировать тогда? Кроме того, зачем это, если утверждение необходимо, так как программа работает с ним или без него?

2 ответа

Решение

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

$PROGRAM_NAME или же $0 по умолчанию возвращает команду, которая загружает программу (минус путь интерпретатора ruby). Например, у вас есть файл скрипта test.rb как это:

#!/usr/bin/env ruby
puts __FILE__
puts $PROGRAM_NAME

Если вы запустите этот скрипт с ruby test.rbпечатает

test.rb
test.rb

Если вы запустите скрипт с ruby /path/to/test.rbпечатает

/path/to/test.rb
/path/to/test.rb

Если вы дадите сценарию разрешение на выполнение и запустите его с ./test.rbпечатает

./test.rb
./test.rb

В отличие от __FILE__, $PROGRAM_NAME а также $0 являются реальными глобальными переменными, и вы можете изменить их значения. $PROGRAM_NAME а также $0 являются псевдонимами друг для друга, поэтому вы меняете значение одного из них, значение другого изменится соответственно. Например, у вас есть test2.rb как это:

#!/usr/bin/env ruby
$0 = 'Hello, world!'
puts $0
puts $PROGRAM_NAME

это печатает

Hello, world!
Hello, world!

__FILE__ текущее имя исходного файла.

Кажется, что код ruby ​​хочет убедиться, что текущий файл соответствует программе, которую нужно выполнить.

$ перед переменной означает ее глобальную переменную.

Проверьте здесь, чтобы узнать больше - http://www.zenspider.com/Languages/Ruby/QuickRef.html

Другие вопросы по тегам