我在审查Ruby代码时发现了这个语法。 代码如下:
if __FILE__ == $PROGRAM_NAME
#some code...
end
我猜 __FILE__
是一个变量,可以获取当前文件的名称?
那么 $PROGRAM_NAME
又代表什么呢?此外,为什么需要这个 if 语句呢?因为程序即使没有它也能正常运行。
我在审查Ruby代码时发现了这个语法。 代码如下:
if __FILE__ == $PROGRAM_NAME
#some code...
end
我猜 __FILE__
是一个变量,可以获取当前文件的名称?
那么 $PROGRAM_NAME
又代表什么呢?此外,为什么需要这个 if 语句呢?因为程序即使没有它也能正常运行。
__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!
$PROGRAM_NAME
(相比之下,$0
则容易)。在官方文件中,我只能在《程序员修炼之道》一书中找到提到$PROGRAM_NAME
,并且仅在English
模块下(尽管实际上不需要引用English模块)。 - Kelvin__FILE__
是当前源文件的文件名。
看起来 Ruby 代码想要确保当前文件对应于需要执行的程序。
$
在变量前面,表示它是一个全局变量。
点击此处了解更多信息 - http://www.zenspider.com/Languages/Ruby/QuickRef.html#18
__FILE__
的含义,而且在于比较的重点,因此它是一个重复的问题,可以参考https://dev59.com/Qm445IYBdhLWcg3w0NWu(其中`$PROGRAM_NAME`和`$0`是相同的)。 - Dave Schweisguth