Ruby の OptionParser の挙動の考察を書き残します。
OptionParser のあまり知られていなさそうなこととして、オプショナルなパラメーターをとるスイッチの定義の仕方が 2種類あり、指定時(パース時)の挙動が違うということです。
まず、ショートオプション、ロングオプションなどと呼ばれているものは、本来は「スイッチ」と呼ぶべきだと思います。
OptionParser::Switch クラスですから。
そして、ハイフン1つから始まるものはショートスイッチ、ハイフン2つから始まるものはロングスイッチです。また、スイッチには、▷パラメーター(argument)をとらないスイッチ、▷必須の(mandatory な / required な)パラメーターをとるスイッチ、▷任意の(optional な)パラメーターをとるスイッチ――の3つがあります。
パラメーターをとらないスイッチは、
opt.on("-f") {...}
opt.on("--foo") {...}
のように定義します。
必須のパラメーターをとるスイッチは、必須のパラメーターをとることを表す文字列を置きます。このとき、
opt.on("-f REQ") {...}
opt.on("--foo REQ") {...}
のように任意の文字列をスペースをあけて定義するものと、
opt.on("-fREQ") {...}
opt.on("--foo=REQ") {...}
のようにショートスイッチにおいてはスペースを省略し、ロングスイッチにおいてはスペースをイコールに置き換えて定義するものがあります。前者と後者のパース時の違いはないように見受けられます。
任意のパラメーターをとるスイッチは、任意のパラメーターをとることを表す文字列を角括弧に続けて置きます。このとき、
opt.on("-f [OPT]") {...}
opt.on("--foo [OPT]") {...}
のように任意の文字列をスペースをあけて定義するものと、
opt.on("-f[OPT]") {...}
opt.on("--foo=[OPT]") {...}
のようにショートスイッチにおいてはスペースを省略し、ロングスイッチにおいてはスペースをイコールに置き換えて定義するものがあります。前者を space タイプと呼ぶこととし、後者を non-space タイプと呼ぶこととします。
パースする場合、任意のパラメーターをとる space タイプのスイッチは、
opt.parse(["-f", "arg"])
opt.parse(["--foo", "arg"])
のように後続に普通の引数を取ることができます。つまり、スペースをあけて引数を指定できるということです。また、
opt.parse(["-farg"])
opt.parse(["--foo=arg"])
のように non-space な指定もできます。
一方、任意のパラメーターをとる non-space タイプのスイッチは、non-space な指定のみできます。スペースをあけて指定するとスイッチへの引数として解釈されません。
オプショナルなパラメーターをとるスイッチを定義するときは space タイプと non-space タイプで違いがあることを覚えておくとよいでしょう。
終わりです。