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

有帮助吗?

解决方案

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

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

其他提示

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

我个人没用过,但是 Rails 似乎广泛使用它rspec 也是如此, ,我想这是一个相当可靠的信任票

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

第一击 在谷歌上搜索“在 ruby​​ 中处理命令行选项“是一篇关于 特罗洛普 这似乎是这项工作的一个很好的工具。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top