0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OptionParser のオプショナルで non-space な指定の可否

Last updated at Posted at 2024-06-11

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 タイプで違いがあることを覚えておくとよいでしょう。


終わりです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?