`if __name__ =='__ main __'`相当于Ruby

Ima*_*ist 98 ruby python program-entry-point

我是Ruby的新手.我想从包含我想要继续单独使用的工具的模块导入函数.在Python中我会这样做:

def a():
    ...
def b():
    ...
if __name__ == '__main__':
    a()
    b()
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*chu 126

从我在野外看到的Ruby(授予,而不是一吨),这不是标准的Ruby设计模式.模块和脚本应该保持独立,所以如果没有一个好的,干净的方法,我不会感到惊讶.

编辑: 找到它.

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

但这绝对不常见.

  • 我也没有看过这个,但它并不令人沮丧.官方Ruby文档使用它:http://www.ruby-lang.org/en/documentation/quickstart/4/ (15认同)
  • 但是,测试的东西很方便 - 你可以将模块测试放在那里,只需从模块文件中运行它们而不需要任何包装器. (8认同)
  • 我认为这正是Rubyists喜欢做的事情.模块定义是模块定义.如果你想对该模块采取一些行动,那很好,但你所采取的行动*不是*模块定义. (5认同)
  • 出于好奇,保持模块和脚本分离的原因是什么? (4认同)
  • @Imagist和@ebneter或者相反:脚本是一个单独的模块,旨在从命令行运行,但您也希望能够在部分测试它并在单独的模块中进行测试.在这种情况下,__NAME__ == $ 0非常宝贵. (3认同)
  • 如果__FILE__ == $ PROGRAM_NAME稍微更具可读性 (2认同)

uKo*_*lka 11

如果堆栈跟踪为空,我们可以开始向右和向左执行.我不知道这是用于传统还是非传统的,因为我已经使用Ruby大约一周了.

if caller.length == 0
  # do stuff
end
Run Code Online (Sandbox Code Playgroud)

概念证明:

file:test.rb

#!/usr/bin/ruby                                                                 

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

puts "Test"
Run Code Online (Sandbox Code Playgroud)

文件:shmest.rb

#!/usr/bin/ruby -I .                                                            

require 'test.rb'

puts "Shmest"
Run Code Online (Sandbox Code Playgroud)

用法:

$ ./shmest.rb 
Test
Shmest

$ ./test.rb
Main script
Test
Run Code Online (Sandbox Code Playgroud)


abl*_*arg 8

if $PROGRAM_NAME == __FILE__
  foo()
  bar()
end 
Run Code Online (Sandbox Code Playgroud)

Rubocop更喜欢这个:

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