Ruby中`if __name__ == '__main__'`的等效写法

117 投票
3 回答
24599 浏览
提问于 2025-04-15 19:11

我刚接触Ruby,想要从一个模块中导入一些功能,因为我想单独继续使用这个工具。在Python中,我可以简单地这样做:

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

这样我就可以运行程序,或者把它当作一个模块来使用 a() 和/或 b() 这两个功能。那么在Ruby中,有什么类似的方法呢?

3 个回答

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

这个是被Rubocop推荐的写法,而不是下面这个:

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
151

从我见过的Ruby代码(虽然不算很多)来看,这并不是一个标准的Ruby设计模式。模块和脚本应该是分开的,所以如果没有一个好的、干净的做法,我也不会感到惊讶。

补充: 找到了。

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

不过,这种做法确实不常见。

撰写回答