kent備忘ログ

お仕事と趣味生活と

optparseライブラリについて

Ruby学習の一環で、optparseライブラリを使用する機会があった為、アウトプットも兼ねて記事にしてみました。初めに公式リファレンスの解説では以下のように記載されています。

optparse を使う場合.

  1. OptionParser オブジェクト を生成する。
  2. オプションを取り扱うブロックを 変数 に登録する。
  3. <変数名>.parse(ARGV) でコマンドラインを実際に parse する。
上記の1、2の手順を先に行います。
1.ライブラリoptparseを呼び出し

optparse_test.rb

require 'optparse'
cmd = OptionParser.new
2.コマンドライン上のオプションとして指定したい値(今回の例の場合'-h'や'-m')を取り扱うブロックを、onメソッドを使用し変数に登録。

個人的にブロックを登録するというイメージが一番掴み辛かった。

optparse_test.rb

# コマンドライン上のオプション -h をブロックに格納
cmd.on('-h') { |val| }
# コマンドライン上のオプション -m をブロックに格納
cmd.on('-m') { |val| }
3. コマンドライン上のオプションに対応する値を、組み込み定数ARGVを使用して実際にパース(解析=プログラム内部で実行できる形式に変換)する。
出力は要素が文字列の配列形式 (ARGVに添え字を指定することで中の要素を取り出すことが出来ます)
結果、"ruby <ファイル名>.rb -h <値> -m <値>"で、使用できるオプションとその値を指定することが出来る。

optparse_test.rb

cmd.parse!(ARGV)
p ARGV
p ARGV[0]
p ARGV.class
p ARGV[0].class
p "今は#{ARGV[0]}#{ARGV[1]}分です"
❯ ruby optparse_test.rb -h 15 -m 30
["15", "30"]
"15"
Array
String
"今は15時30分です"

なお、parse!ではなくparseと記述すると、登録したオプション名まで一緒にパースされる

optiparse.rb

cmd.parse(ARGV)
p ARGV
p ARGV[0]
❯ ruby optparse_test.rb -h 15 -m 30
["-h", "15", "-m", "30"]
"-h"
余談ですがoptparseにはデフォルトで--helpオプションと--versionオプションが設定されており、それぞれ"<ファイル名>.rb --help"、 "<ファイル名>.rb --version"で呼び出すことができます。

"<ファイル名>.rb --help"では参照したファイルで使用できる(今回設定した)オプションの一覧が表示されます。

❯ ruby test_paper.rb --help
Usage: test_paper [options]
    -h
    -m

バージョン定数が定義されていると、"ruby <ファイル名>.rb --version"でバージョンが出力される。
(実際には与えられたARGVがパースされる前に定義、今回は変数cmdにOptionParserモジュールを設定した後に記述) optparse_test.rb

require 'optparse'
cmd = OptionParser.new
Version = "1.0.1"
❯ ruby optparse_test.rb --version
optparse_test 1.0.1