`if __name__ == '__main__'` 等价于 Ruby

Posted

技术标签:

【中文标题】`if __name__ == \'__main__\'` 等价于 Ruby【英文标题】:`if __name__ == '__main__'` equivalent in Ruby`if __name__ == '__main__'` 等价于 Ruby 【发布时间】:2011-01-15 23:58:09 【问题描述】:

我是 Ruby 的新手。我正在寻找从包含我想继续单独使用的工具的模块中导入函数。在 Python 中,我会简单地这样做:

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

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

【问题讨论】:

Run a Ruby library from the command-line 的可能重复项 【参考方案1】:

根据我在野外看到的 Ruby(当然,不是很多),这不是标准的 Ruby 设计模式。模块和脚本应该是分开的,所以如果没有真正好的、干净的方式来做这件事,我不会感到惊讶。

编辑: Found it.

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

但这绝对不常见。

【讨论】:

出于好奇而将模块和脚本分开的原因是什么? 我认为这正是 Ruby 主义者喜欢做的事情。模块定义是模块定义。如果你想对该模块采取一些行动,很好,但你正在采取的行动不是模块定义。 不过,它很方便用于测试——您可以将模块测试放在那里,然后直接从模块文件中运行它们而无需任何包装。 @Imagist 和 @ebneter 或者反过来:脚本是一个旨在从命令行运行的单个模块,但您还希望能够对它进行部分测试并拥有在单独的模块中测试。在这种情况下,NAME == $0 是无价的。 我也没有看到这个,但它并不令人不悦。官方 Ruby 文档使用它:ruby-lang.org/en/documentation/quickstart/4【参考方案2】:

如果堆栈跟踪为空,我们可以开始左右执行。我不知道这是常规使用还是非常规使用,因为我进入 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

【讨论】:

【参考方案3】:
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

Rubocop 更喜欢这个:

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

【讨论】:

以上是关于`if __name__ == '__main__'` 等价于 Ruby的主要内容,如果未能解决你的问题,请参考以下文章

if __name__ == "__main__": 做啥?

if __name__ == "__main__": 做啥?

Python中的构造“ if __name__ == '__main__'”

unittest: if __name__ == "__main__" 理解

`if __name__ == '__main__'` 等价于 Ruby

if __name__=='__main__'