__FILE__ == $ PROGRAM_NAME在ruby中意味着什么?

Mc-*_*-Ac 6 ruby variables special-variables

在查看Ruby中的代码时,我偶然发现了这个sintax.代码是:

if __FILE__ == $PROGRAM_NAME
  #some code...
end
Run Code Online (Sandbox Code Playgroud)

我想__FILE__是一个变量,它让我知道我所在文件的名称?但那么什么是$PROGRAM_NAMEsimbolize呢?另外,为什么这个if语句是必要的,因为程序可以使用或不使用它?

Aet*_*rus 9

__FILE__始终返回源文件的路径.它不是变量,因此您无法为其赋值.它是返回相对路径还是绝对路径取决于您运行脚本的方式.

$PROGRAM_NAME或者$0默认情况下返回引导程序的命令(减去ruby解释器的路径).例如,您有一个这样的脚本文件test.rb:

#!/usr/bin/env ruby
puts __FILE__
puts $PROGRAM_NAME
Run Code Online (Sandbox Code Playgroud)

如果您运行此脚本ruby test.rb,则会打印

test.rb
test.rb
Run Code Online (Sandbox Code Playgroud)

如果您运行脚本ruby /path/to/test.rb,则打印

/path/to/test.rb
/path/to/test.rb
Run Code Online (Sandbox Code Playgroud)

如果您为脚本提供执行权限并运行它./test.rb,则会打印出来

./test.rb
./test.rb
Run Code Online (Sandbox Code Playgroud)

不像__FILE__,$PROGRAM_NAME而且$0是真正的全局变量,你可以改变它们的值.$PROGRAM_NAME并且$0是彼此的别名,因此您更改任何一个的值,另一个的值将相应地更改.例如,你有test2.rb这样的:

#!/usr/bin/env ruby
$0 = 'Hello, world!'
puts $0
puts $PROGRAM_NAME
Run Code Online (Sandbox Code Playgroud)

它打印

Hello, world!
Hello, world!
Run Code Online (Sandbox Code Playgroud)

  • `$ PROGRAM_NAME`很难在文档中找到(相比之下,`$ 0`很容易).在官方文档方面,我只能在Pragmatic Programmer的书中找到`$ PROGRAM_NAME',并且只能在`English`模块下找到(即使你实际上不需要英语). (2认同)