用于使用命令行选项的ruby习语

时间:2008-09-02 02:29:07

标签: ruby idioms

我试图通过移植一个中型(非OO)perl程序来获取ruby。我个人的习惯之一是设置这样的选项:

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

在Perl中,我有点咬牙切齿,让$ opt_v(有效地)成为全球性的。

在红宝石中,或多或少精确的等价物将是

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

其中$ opt_verbose是类可以访问的全局。让课程知道这样的全球旗帜似乎......呃......错了。 OO惯用的方法是什么?

  • 让主程序处理所有与选项相关的东西,并让类只返回它决定如何处理的东西?
  • 让类实现可选行为(例如,知道如何详细)并通过attr_writer类型设置模式?

更新:感谢您提出optparse的答案,但我应该更清楚一点,它不是如何来处理我要求的命令行选项,但更多有效设置全局程序状态的命令行选项与理想情况下应该独立于这类事物的类之间的关系。

3 个答案:

答案 0 :(得分:3)

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

我倾向于使用这种技术,其中选项包含在一个对象中,并在方法调用上使用attr_writers或option参数将相关选项传递给任何其他对象。这样,外部类中包含的任何代码都可以与选项本身隔离 - 如果您的选项设置为{{thingy,则无需担心主例程中变量的命名。 1}} attr_writer或thingy.verbose=true来电。

答案 1 :(得分:2)

optparse库是标准发行版的一部分,因此您无需任何第三方内容即可使用它。

我个人没有使用它,但rails seems to use it extensivelyso does rspec,我认为这是一个非常可靠的信任投票

This example from rails' script/console似乎很容易展示如何使用它

答案 2 :(得分:1)

谷歌上的first hitprocessing command line options in ruby”是一篇关于Trollop的文章,似乎是这项工作的好工具。