什么`if __FILE__ == $ 0`在Ruby中意味着什么

mlz*_*boy 51 ruby

if __FILE__ == $0
  $:.unshift File.join(File.dirname(__FILE__),'..')
Run Code Online (Sandbox Code Playgroud)

我在Ruby中发现了这个代码,这是什么意思?

Phr*_*ogz 55

# 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
Run Code Online (Sandbox Code Playgroud)

请注意,这种特殊做法(添加到LOAD_PATH目录)通常不需要出现require_relative,并且expand_path是查找父目录的更简单方法.

  • 非常好的答案,我只是建议注意常数的含义.`__FILE__`:这个文件名,`$ 0`:运行的主文件,`$:`:LOAD_PATH (13认同)

Dig*_*oss 36

这是一些Ruby Mini-Design-Patterns

它的意思是:

  • 如果文件正在直接执行,即作为脚本,
  • 然后找到脚本所在的目录,并将其添加到load/require搜索路径的开头

条件部分可用于许多事情.可以编写Ruby文件以提供大型程序的功能,但也可以(使用额外的代码)作为脚本.或者,脚本表单可以运行模块的测试,而组件表单为更大的程序实现一些类,并且只有在通过名称引用时才调用测试.

路径前置有一些一般用途,除了显而易见的查找私有包含.如果你有几个不同的版本或版本的东西,这样任何伴侣"可执行文件"(脚本)将被优先调用./ usr/local/release232/bin /无论从哪个bin目录运行所有内容,即使release220在默认路径上更早.

  • +1用于解释成语有用的原因/位置. (6认同)

the*_*ide 14

关于ruby-lang.org的内容/原因的一个很好的解释:

__FILE__是包含当前文件名称的魔术变量.$0是用于启动程序的文件的名称. 此检查说"如果这是正在使用的主文件..."这允许将文件用作库,而不是在该上下文中执行代码,但如果该文件被用作可执行文件,则执行该代码.

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


小智 10

红宝石,像任何语言,有一些保留关键字包括if,return,class; 其中一个碰巧是__FILE__.Ruby用于__FILE__保存当前的源文件名.

前缀$在变量名称上表示全局变量.在这种情况下,$0包含正在执行的脚本的名称.例如,如果你运行ruby hello_world.rb,值$0hello_world.rb

if __FILE__ == $0
  ...
end
Run Code Online (Sandbox Code Playgroud)

现在,只有当包含源代码的文件与您正在执行的文件相同时,才会执行if语句中的代码.为了更好的解释,让我们创建2个文件.

第一hello_world.rb:

# hello_world

puts "Hello world"
Run Code Online (Sandbox Code Playgroud)

第二个hello_pluto.rb:

# hello_pluto

require_relative "hello_world"
puts "Hello Pluto"
Run Code Online (Sandbox Code Playgroud)

在这里,如果你运行ruby hello_world.rb,它将只输出:

Hello world
Run Code Online (Sandbox Code Playgroud)

现在,如果你运行ruby hello_pluto.rb,它将输出:

Hello world
Hello Pluto
Run Code Online (Sandbox Code Playgroud)

它实际上也运行文件hello_world.现在将来自hello_world的代码粘贴到if语句中并再次运行hello_pluto:

# hello_world

if __FILE__ == $0
  puts "Hello world"
end
Run Code Online (Sandbox Code Playgroud)

正如所料,您唯一看到的是印刷品Hello Pluto.因此,if语句保证语句中的任何代码只有在源文件与您运行的脚本相同时才会运行.

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


Sea*_*bry 8

我建议你使用$PROGRAM_NAME别名,$0因为它更清楚你在使用它时的意思 - 它们的含义相同.

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

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

让我们演示一下如何使用代码.

1.创建hello.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
Run Code Online (Sandbox Code Playgroud)

看看如果你自己运行这个文件会发生什么:

$ ruby hello.rb
Hello, world!
$0       = hello.rb
__FILE__ = hello.rb
Run Code Online (Sandbox Code Playgroud)

2.创建一个Rakefile

require 'rake'
require_relative 'hello'

task :hello do
  Hello.world
end
Run Code Online (Sandbox Code Playgroud)

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

$ rake hello
Hello, world!
$0       = /Users/sean/.rbenv/versions/2.3.0/bin/rake
__FILE__ = /Users/sean/Projects/hello/hello.rb
Run Code Online (Sandbox Code Playgroud)

if $PROGRAM_NAME == __FILE__条件中包装Ruby文件末尾的代码是许多开发人员用来说"只有在你单独运行这个文件时才执行此代码"的习惯用法.

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

如果你没有将你的示例代码包装在这个条件中,那么只要在较大程序的生命周期中需要/加载文件就会执行它,这几乎肯定不是你想要的.


Dan*_*iel 5

这意味着如果文件直接运行,不是必需或加载,则将脚本父目录添加到$ LOAD_PATH(ruby搜索需要的文件的路径()d)