在Ruby中,“if __FILE__ == $ 0”是什么意思

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 

请注意,这种特殊的做法(添加到LOAD_PATH目录中)对于require_relative的出现通常是不必要的, expand_path是查找父目录的一种更简单的方法。

这是几个ruby迷你devise模式

它的意思是:

  • 如果文件正在直接执行,即作为脚本,
  • 那么find脚本所在的目录,并将其前置到加载/需求searchpath的开头

条件部分可以用于很多事情。 可以编写一个Ruby文件来为大型程序提供function,但也可以使用(使用额外的代码)作为脚本。 或者,脚本表单可以运行模块的testing,而组件表单则为一个更大的程序实现一些类,只有在名称引用时才调用testing。

path预先有一些普遍的用途,除了明显的find私有包含之外。 如果你有几个不同的版本或版本的东西,这样任何伴侣“可执行文件”(脚本)将被优先调用。 / usr / local / release232 / bin /不pipe什么都可以从同一个bin目录中运行所有的东西,即使release220在默认path上早一些。

来自ruby-lang.org的一个很好的解释:

__FILE__是包含当前文件名称的魔术variables。 $0是用于启动程序的文件的名称。 该检查显示“如果这是正在使用的主文件…”,则允许将文件用作库,而不是在该上下文中执行代码,但如果该文件正被用作可执行文件,则执行该代码。

请参阅: https : //www.ruby-lang.org/en/documentation/quickstart/4/

Ruby和其他语言一样,有一些保留的关键字,包括ifreturnclass ; 其中一个恰好是__FILE__ 。 Ruby使用__FILE__来保存当前的源文件名。

在variables的名称前面加上$表示一个全局variables。 在这种情况下, $0包含正在执行的脚本的名称。 例如,如果运行ruby hello_world.rb ,则$0的值将是hello_world.rb

 if __FILE__ == $0 ... end 

现在,if语句中的代码将只在包含源代码的文件与您正在执行的文件相同时执行。 为了更好的解释,我们创build2个文件。

第一个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 。 因此,如果语句保证只有源文件与您正在运行的脚本相同,任何位于语句中的代码才会运行。

参考: http : //periclestheo.com/2014/02/what-is-up-with- 文件 – 和 – $ 0.html

这意味着如果文件直接运行,不需要或加载,然后将脚本父目录添加到$ LOAD_PATH(path在哪里rubysearch文件需要()d)

我build议你使用$PROGRAM_NAME别名$0因为它更清楚你使用它的意思 – 他们的意思是一样的。

现在, $PROGRAM_NAME / $0是什么意思? 从Ruby文档 :

$ 0
包含正在执行的脚本的名称。 可以分配。

让我们来演示一下这个代码如何工作。

1.创buildhello.rb

 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 

2.创build一个Rakefile

 require 'rake' require_relative 'hello' task :hello do Hello.world end 

现在从Rake任务的上下文中执行相同的代码:

 $ 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__中包含Ruby文件末尾的代码if $PROGRAM_NAME == __FILE__ _ if $PROGRAM_NAME == __FILE__ conditional是许多开发人员用来说“只有在单独运行此文件时才执行此代码”的习惯用法。

你会在这个条件包装什么样的代码? 我经常用它来演示如何使用一个模块。 这也使得单独执行这个文件非常方便,以确保它可以在您正在编写的较大程序的环境之外工作。

如果你没有在这个条件下包装你的示例代码,那么无论何时在你的大型程序的生命周期中需要/加载该文件时,它都会被执行,这几乎肯定不是你想要的。