4

中規模の (非 OO の) perl プログラムを移植して Ruby を取り上げようとしています。私の個人的なイディオムの 1 つは、次のようにオプションを設定することです。

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

しばらく前に、Rubyのコマンドラインスクリプト用のかなり長いスケルトンを提示したこのブログ投稿(Todd Werthによる)に出くわしました。彼のスケルトンは、アプリケーションコードがインスタンス化されたアプリケーションクラスにカプセル化され、アプリケーションオブジェクトで「run」メソッドを呼び出すことによって実行されるハイブリッドアプローチを使用しています。これにより、オプションをクラス全体のインスタンス変数に格納できるため、アプリケーションオブジェクト内のすべてのメソッドが、スクリプトで使用される可能性のある他のオブジェクトに公開することなく、オプションにアクセスできます。

オプションが1つのオブジェクトに含まれ、メソッド呼び出しでattr_writersまたはオプションパラメーターのいずれかを使用して、関連するオプションを追加のオブジェクトに渡すこの手法を使用することに傾倒します。このようにして、外部クラスに含まれるコードをオプション自体から分離できます。オプションがattr_writerまたは呼び出しthingyで設定されている場合、クラス内からメインルーチンの変数の名前を気にする必要はありません。thingy.verbose=truethingy.process(true)

于 2008-09-03T01:41:55.677 に答える
2

optparseライブラリは標準ディストリビューションの一部であるため、サードパーティのものを必要とせずに使用できます。

私は個人的には使用していませんが、Rails は広範囲に使用しているようでrspec もそうです。

Railsのこの例は、script/consoleそれを非常に簡単かつ適切に使用する方法を示しているようです

于 2008-09-02T03:18:33.830 に答える
1

ruby​​ でコマンド ライン オプションを処理する」について Google で最初にヒットしたのは、この仕事に適したツールと思われるTrollopに関する記事です。

于 2008-09-02T02:53:02.907 に答える