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

4

我正在尝试通过移植一个中等规模的(非面向对象)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是一个全局变量,类可以访问。让类知道这样的全局标志似乎不太对。那么,有没有面向对象的方式来解决这个问题呢?
  • 让主程序处理所有与选项相关的内容,并让类只返回它所决定如何处理的内容?
  • 让类实现可选行为(例如,知道如何详细说明),并通过attr_writer之类的方式设置模式?
更新:感谢提供optparse建议的答案,但我应该更清楚地表明,我询问的不是关于如何处理命令行选项,而是关于有效设置全局程序状态的命令行选项和应该独立于这种情况的类之间的关系。
3个回答

3
我之前发现了这篇博客文章(作者为Todd Werth),其中提供了Ruby命令行脚本的一个相当冗长的框架。他的框架采用了一种混合方法,应用程序代码被封装在一个应用程序类中,该类被实例化,然后通过在应用程序对象上调用“run”方法来执行。这允许选项存储在类范围的实例变量中,以便应用程序对象中的所有方法都可以访问它们,而不将其暴露给脚本中可能使用的任何其他对象。
我倾向于使用这种技术,其中选项包含在一个对象中,并使用attr_writers或方法调用的选项参数将相关选项传递给任何其他对象。这样,包含在外部类中的任何代码都可以与选项本身隔离开来--如果您的选项是使用thingy.verbose=true attr_writer或thingy.process(true)调用设置的,则无需担心从thingy类内部的主例程中变量的命名问题。

1
注意:Todd的URL结构似乎略有变化;现在它位于这里 - lindes

2

过时的 script/console 链接,新链接为 https://github.com/rails/rails/blob/master/railties/lib/rails/commands/console.rb。 - Steen

1

我不认为这是厌恶女性的。他们没有称呼任何人,也没有对任何人的放荡做出任何评判等。 - John
这个词的一个定义是“被视为性道德败坏或轻佻的女人。” 在我看来,这个词只能将其不名誉归因于女性,这表明了厌恶女性。 鉴于此,我认为将该术语应用于_任何事物_都会传播一种厌恶女性的模因:即存在某些只适用于女性的不名誉形式的想法。 - lindes
注意:我对软件本身没有任何评判,因为我还没有仔细研究过它。我只是评论它的名称。 - lindes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接