代码之家  ›  专栏  ›  技术社区  ›  robc

使用命令行选项的Ruby习惯用法

  •  4
  • robc  · 技术社区  · 18 年前

    我正试图通过移植一个中型(非OO)Perl程序来获取Ruby。我的一个习惯用法是设置如下选项:

    use Getopt::Std;
    our $opt_v;  # be verbose
    getopts('v');
    # and later ...
    $opt_v && print "something interesting\n";
    

    在Perl中,我咬紧牙关,让$opt v(实际上)成为一个全球性的。

    在Ruby中,或多或少精确的等价物是

    require 'optparse'
        opts.on("-v", "--[no-]verbose", TrueClass, "Run verbosely") {
            |$opt_verbose|
        }
        opts.parse!
    end
    

    其中$opt_verbose是类可以访问的全局。让班级知道这样的全局标志…呃。。。错了。OO的惯用方法是什么?

    • 让主程序处理所有与选项相关的东西,让类将它决定如何处理的东西返回给它?
    • 类是否实现了可选的行为(例如,知道如何变得冗长)并通过attr-writer之类的东西设置了模式?

    更新: 谢谢你提出的建议,但我应该更清楚的是不是 怎样 为了处理命令行选项,我在问,但更多的是命令行选项之间的关系,有效地设置一个全局程序状态和类,理想情况下应该独立于这类事情。

    3 回复  |  直到 12 年前
        1
  •  3
  •   kbrock    13 年前

    不久前我遇到了 this blog post (由ToddWerth)为Ruby中的命令行脚本提供了一个相当长的框架。他的框架使用了一种混合方法,其中应用程序代码被封装在一个应用程序类中,该类被实例化,然后通过对应用程序对象调用“run”方法来执行。这允许选项存储在类范围的实例变量中,以便应用程序对象中的所有方法都可以访问它们,而不将它们暴露给脚本中可能使用的任何其他对象。

    我倾向于使用这种技术,其中选项包含在一个对象中,并在方法调用中使用attr_编写器或选项参数将相关选项传递给任何其他对象。这样,外部类中包含的任何代码都可以与选项本身隔离开来——无需担心主例程中变量的命名来自 thingy 如果选项设置为 thingy.verbose=true 打字机或 thingy.process(true) 打电话。

        2
  •  2
  •   Orion Edwards    18 年前

    这个 optparse 图书馆是标准发行版的一部分,因此您可以在不需要任何第三方资料的情况下使用它。

    我没有亲自使用过,但是 rails seems to use it extensively 和 so does rspec 我想这是一个相当可靠的信任票

    This example from rails' script/console 似乎可以很容易很好地使用它

        3
  •  1
  •   John    18 年前

    这个 first hit 谷歌的“ processing command line options in ruby “是一篇关于 Trollop 这似乎是这项工作的一个好工具。

    推荐文章