ruby习惯用法,用于命令行选项

时间:2020-03-05 18:46:12  来源:igfitidea点击:

我正在尝试通过移植中型(非OO)perl程序来获取红宝石。我的个人习惯之一是设置以下选项:

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的答案,但我应该更清楚地知道,这不是如何处理我要询问的命令行选项,而是有效设置全局程序状态的命令行选项与该类之间的关系。理想情况下应该独立于此类事物。

解决方案

回答

在Google上首次出现"在ruby中处理命令行选项"的文章是有关Trollop的文章,这似乎是完成这项工作的好工具。

回答

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

我还没有亲自使用过它,但是Rails似乎广泛使用了它,rspec也是如此,我想这是非常可靠的信任

来自rails的" script / console"的示例似乎展示了如何轻松,漂亮地使用它

回答

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

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