4

我正在尝试通过移植一个中型(非 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 的答案,但我应该更清楚的是,这不是如何处理我要询问的命令行选项,而是更有效地设置全局程序状态的命令行选项和类之间的关系理想情况下应该独立于那种事情。

4

3 回答 3

3

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

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

于 2008-09-03T01:41:55.677 回答
2

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

我没有亲自使用过它,但rails 似乎广泛使用它, rspec也是如此,我想这是一个非常可靠的信任投票

这个来自 rails 的例子script/console似乎展示了如何非常容易和很好地使用它

于 2008-09-02T03:18:33.830 回答
1

谷歌上关于“在 ruby​​ 中处理命令行选项”的第一次点击是一篇关于Trollop的文章,这似乎是完成这项工作的好工具。

于 2008-09-02T02:53:02.907 回答