109

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

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

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

4

3 回答 3

144

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

编辑: 找到了。

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

但这绝对不常见。

于 2010-02-12T02:36:16.800 回答
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
于 2013-10-14T22:55:45.803 回答
10
if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 

Rubocop更喜欢这个:

if __FILE__ == $0
    foo()
    bar()
end
于 2020-02-11T23:50:45.900 回答