相当于Ruby中的`if __name__ =='__main __'`


101

我是Ruby的新手。我正在从包含要继续单独使用的工具的模块中导入函数。在Python中,我只需执行以下操作:

def a():
    ...
def b():
    ...
if __name__ == '__main__':
    a()
    b()

这使我可以运行程序或将其导入为模块使用a()和/或b()单独使用。Ruby中的等效范例是什么?



Answers:


130

从我在野外看到的Ruby(当然,不是一吨)来看,这不是标准的Ruby设计模式。模块和脚本应该保持独立,因此,如果没有真正好的清洁方法,我也不会感到惊讶。

编辑: 找到了。

if __FILE__ == $0
    foo()
    bar()
end

但这绝对不常见。


4
出于好奇而将模块和脚本分开的背后原因是什么?
Imagist'2

5
我认为这只是Rubyists愿意做的。模块定义是模块定义。如果您想对该模块执行某些操作,那很好,但是您要执行的操作不是模块定义。
Matchu

8
但是,对于进行测试很方便-您可以在其中放置模块测试,然后仅从模块文件运行它们而无需任何包装。
ebneter

3
@Imagist和@ebneter或相反:脚本是一个单独的模块,旨在从命令行运行,但是您还希望能够对其进行部分测试,并在单独的模块中进行测试。在这种情况下,NAME == $ 0是无价的。
混乱

16
我也没有看过,但是对此并不皱眉。正式的Ruby文档使用它:ruby-lang.org/en/documentation/quickstart/4
cflewis 2010年

12

如果堆栈跟踪为空,我们可以从左右开始执行。我不知道这是常规使用还是非常规使用,因为我进入Ruby大约一周了。

if caller.length == 0
  # do stuff
end

概念证明:

文件:test.rb

#!/usr/bin/ruby                                                                 

if caller.length == 0
  puts "Main script"
end

puts "Test"

文件:shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"

用法:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.