在 Ruby 中,__FILE__ == $PROGRAM_NAME 是什么意思?

8

我在审查Ruby代码时发现了这个语法。 代码如下:

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

我猜 __FILE__ 是一个变量,可以获取当前文件的名称? 那么 $PROGRAM_NAME 又代表什么呢?此外,为什么需要这个 if 语句呢?因为程序即使没有它也能正常运行。


我认为这是一个重复的问题,它与八年前发布的这个 SO 问题相同。你可以通过搜索"ruby __file__" (就像我一样)来找到答案。这是第一个搜索结果。 - Cary Swoveland
1
这个问题的重点不仅在于__FILE__的含义,而且在于比较的重点,因此它是一个重复的问题,可以参考https://dev59.com/Qm445IYBdhLWcg3w0NWu(其中`$PROGRAM_NAME`和`$0`是相同的)。 - Dave Schweisguth
@Dave是对的。这里有一篇博客文章,您可能会发现它有用。 (从我的谷歌搜索中排名第5位。) - Cary Swoveland
2个回答

16

__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!

谢谢!这是一个很好的解释! - Mc-Ac
4
在文档中很难找到$PROGRAM_NAME(相比之下,$0则容易)。在官方文件中,我只能在《程序员修炼之道》一书中找到提到$PROGRAM_NAME,并且仅在English模块下(尽管实际上不需要引用English模块)。 - Kelvin

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接