if __FILE__ == $0
$:.unshift File.join(File.dirname(__FILE__),'..')
我在 Ruby 中发现了这段代码,它的含义是什么?
if __FILE__ == $0
$:.unshift File.join(File.dirname(__FILE__),'..')
我在 Ruby 中发现了这段代码,它的含义是什么?
# 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
需要注意的是,随着require_relative
的出现,通常不需要采用将目录添加到LOAD_PATH的做法。而expand_path
则是一种更简单的查找父目录的方法。
__FILE__
:当前文件名,$0
:被运行的主文件,$:
:LOAD_PATH。 - Nemo157它的意思是:
条件部分可以用于许多事情。Ruby文件可以编写为为大型程序提供功能,但也可用作脚本(带有额外代码)。或者,脚本形式可以运行模块的测试,而组件形式实现一些类来为更大的程序调用测试,前提是名称引用已经存在。
路径添加具有一些通用用途,除了查找私有包含项的明显用途之外。如果您有几个不同版本或发行版的软件,则可以使用此方法优先调用任何“可执行文件”(脚本)。 /usr/local/release232/bin/whatever将从相同的bin目录运行所有内容,即使release220在默认路径上较早。
来自ruby-lang.org的优秀解释:
__FILE__
是一个特殊变量,它包含当前文件的名称。$0
是启动程序所使用的文件名。 这个检查表示“如果正在使用的是主文件…” 这允许将文件用作库,而不在该上下文中执行代码,但如果该文件被用作可执行文件,则执行该代码。
像其他编程语言一样,Ruby也有一些保留关键字,包括if
、return
和class
;其中之一是__FILE__
。Ruby使用__FILE__
来保存当前源文件的名称。
变量名前面加上$
表示全局变量。在这种情况下,$0
包含正在执行的脚本的名称。例如,如果你运行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语句保证了任何位于该语句内部的代码只有在源文件与您正在运行的脚本相同时才会运行。
参考:http://periclestheo.com/2014/02/what-is-up-with-FILE-and-$0.html
$PROGRAM_NAME
作为$0
的别名,因为当您使用它时,它会更清晰地表达您的意思——它们的含义相同。
那么,$PROGRAM_NAME
/$0
是什么意思呢? 请参考Ruby文档:
$0
包含正在执行的脚本的名称。可以被分配。
让我们通过代码演示一下它是如何工作的。
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
require 'rake'
require_relative 'hello'
task :hello do
Hello.world
end
$ rake hello
Hello, world!
$0 = /Users/sean/.rbenv/versions/2.3.0/bin/rake
__FILE__ = /Users/sean/Projects/hello/hello.rb
if $PROGRAM_NAME == __FILE__
条件语句包装代码是许多开发人员常用的习惯用法,意为“仅在单独运行此文件时才执行此代码”。$PROGRAM_NAME
的文档在哪里可以找到? - ShadSterling
$PROGRAM_NAME
而不是$0
。在我看来这很糟糕。 - akostadinov