$Copyleft: (c) 2001 Nobuyoshi Nakada <nobu.nokada@softhome.net> $
$Id: FIRSTSTEP.ja.rd,v 0.5 2001/04/13 06:41:28 nobu Exp $

=begin
= はじめに
OptionParser はコマンドライン引数のオプションの解析を簡単に行うためのク
ラスである。

コマンドライン引数の解析というのは、だいたいどんなツールでもほとんど同じ
パターンが必要になる。そしてこれにはいくつかの流儀のようなものがある。

== 短形式と長形式オプション
Unix 上のツールのオプションスイッチは、伝統的に(({-})) に続く英字一文
字で指定される。これは通常複数のものを続けて指定することもできる。
例えば(({ls}))コマンドなら、次の２つは同じ動作をする。

  ls -l -a

  ls -la

また、最近の GNU tools などは (({--})) で始まる長い名前のスイッチも使
える。

  ls --all

(('OptionParser'))はこの両方の形式をサポートする。
もちろん混ぜて使うことも可能。

= 使い方
== 一番単純な使い方

    require 'optparse'
    ARGV.options {|q|
      q.def_option('--help', 'show this message') {puts q; exit(0)}	# <- (1)
      q.parse!
    } or exit(1)

これだけで、((%--help%))、((%--hELp%))、((%--hEl%))、((%--HE%))、
((%--h%)) などの長形式のスイッチ((-長形式のスイッチに対しては大文字小
文字は区別しない-))に加えて、((%-h%))という短形式のオプションスイッチ
が使えるようになる。(('OptionParser'))では、短形式のスイッチが見付から
なかった場合、自動的に長形式の省略形とみなすためだ。

このスクリプトに対して((%--help%))スイッチを指定すると、(1)のブロック
が実行される。(({puts q}))というのは、指定できるオプションの一覧を表示
することを意味する。

正しくないスイッチを指定されたときには、エラーメッセージを(({STDERR}))
に表示して終了コード1で終了する。

((-(({def_option}))というのは古いバージョンでは使えない。
替わりに(({on}))を使う。-))

== フラグの設定

通常、オプションスイッチが指定された場合は何らかのフラグ((-グローバル
変数が使われることも多い-))などをセットしておいて、あとで参照できるよ
うにする。

    require 'optparse'
    $verbose = false
    ARGV.options {|q|
      q.def_option('-v', '--verbose', 'run verbosely') {$verbose = true}
      q.parse!
    } or exit(1)
    puts "verbose=#$verbose"

これで、((%--verbose%))や((%-V%))などと指定されれば、(1)のブロックが実行されて
((|$verbose|))には(({true}))がセットされることになる。

== フラグの on/off

フラグの指定を取り消すようにすることもできる。

    require 'optparse'
    $verbose = false
    ARGV.options {|q|
      q.def_option('-v', '--[no-]verbose', 'run verbosely') {|$verbose|}
      q.parse!
    } or exit(1)
    puts "verbose=#$verbose"

(('--verbose'))に(('[no-]'))というのが付いているが、これは否定形が使えることを意味している。
((%--no-verbose%))と指定されれば、((|$verbose|))には(({false}))がセットされる。

== 否定形のフラグ

    require 'optparse'
    $execute = true
    ARGV.options {|q|
      q.def_option('-v', '--[no-]verbose', 'run verbosely') {|$verbose|}
      q.def_option('-n', '--no-execute', 'not actually run') {|$execute|}
      q.parse!
    } or exit(1)
    puts "verbose=#$verbose"
    puts "execute=#$execute"

次の((%--no-execute%))では、(('[no-]'))の替わりに(('no-'))となっている。
この違いは、どちらがデフォルトになっているか、つまり短形式が肯定形か否定形かということだ。
(('[]'))付きの場合は肯定形、付いていない場合は否定形がデフォルトになる。
つまり、単に((%-v%))と指定されたときは((|$verbose|))は(({true}))になるが、
((%-n%))なら((|$execute|))には(({false}))がセットされる。

=end
