【问题标题】:Should I define a main method in my ruby scripts?我应该在我的 ruby​​ 脚本中定义一个 main 方法吗?
【发布时间】:2010-10-09 14:55:06
【问题描述】:

在python中,一个模块必须有一个main函数,但通常的做法是使用以下成语:

def my_main_function():
    ... # some code

if __name__=="__main__":  # program's entry point
    my_main_function()

我知道 Ruby 也没有 main 方法,但是我应该遵循某种最佳实践吗?我应该将我的方法命名为 main 还是什么?

Wikipedia page about main methods 对我没有帮助。


作为旁注,我还在 python 中看到了以下成语:

def my_main_function(args=[]):
    ... # some code

if __name__=="__main__":  # program's entry point
    import sys
    sys.exit(my_main_function(sys.argv))

【问题讨论】:

    标签: ruby main-method


    【解决方案1】:

    我经常用

    if __FILE__ == $0
      x = SweetClass.new(ARGV)
      x.run # or go, or whatever
    end
    

    所以是的,你可以。这取决于你在做什么。

    【讨论】:

    • 这是个好建议 - 这样,您的文件既可以用作独立的可执行文件,也可以用作库
    • +1 酷。我有一个更复杂的方式归结为基本相同的事情。我会用这个替换它。
    • 如果您使用的是 ruby​​-prof 等,则条件无法正常工作。
    【解决方案2】:

    我一直发现$PROGRAM_NAME 比使用$0 更具可读性。在我看到类似“Perl”的全局变量的一半时间里,我必须去查找它们。

    
    if __FILE__ == $PROGRAM_NAME
      # Put "main" code here
    end
    

    【讨论】:

      【解决方案3】:

      您应该将库代码放在 lib/ 中,将需要库代码的可执行文件放在 bin/ 中。这具有与 RubyGems 的打包方法兼容的额外优势。

      常见的模式是 lib/application.rb(或者最好是更适合您的域的名称)和 bin/application,其中包含:

      require 'application'
      Application.run(ARGV)
      

      【讨论】:

      • 这是一个很好的答案。将您的脚本放在 ./bin 中并将#!/usr/bin/env ruby 添加到顶部。然后让它可执行(chmod +x),你就有了组织良好且易于理解的东西。
      【解决方案4】:

      我个人的经验法则是:时刻

      if __FILE__ == $0
          <some code>
      end
      

      超过 5 行,我将其提取到 main 函数。这适用于 Python 和 Ruby 代码。没有那段代码看起来结构很差。

      【讨论】:

        【解决方案5】:

        没有。

        为什么要增加一层额外的复杂性却没有真正的好处? Rubyists 没有使用它的约定。

        我会等到您第二次需要使用它(这可能比您想象的要少),然后重构它以使其可重用,这可能会涉及像上面这样的构造。

        【讨论】:

        • 好处是你的文件既可以是库也可以是脚本。我一直用这个成语。
        猜你喜欢
        • 2011-07-29
        • 2013-09-16
        • 1970-01-01
        • 2011-11-25
        • 2016-06-22
        • 1970-01-01
        • 2021-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多