しぐまろぐ

勉強したことや読んだ本について書きます。

Rubyのoptparseの使い方について

はじめに

HappinessChainの課題でRubyのoptparseを使用したので、使い方について簡単にまとめます。
使用したRubyのバージョンは3.2.2です。
optparseについての詳細は以下の公式リファレンスを確認してください。

docs.ruby-lang.org

optparseとは何か

optparseはRubyの標準ライブラリの一つで、コマンドラインのオプションを取り扱うのに使用します。

optparseを使わない場合

optparseを使用しなくても、ARGVを使用すればコマンドラインの引数を受け取ることはできます。

たとえば、aオプションとbオプションを使い、それぞれに数値の引数を受け取りたいとします。

$ ruby sumple.rb -a 1 -b 2
# sample.rb
hikisu0 = ARGV[0] # "-a"
hikisu1 = ARGV[1] # "1"
hikisu2 = ARGV[2] # "-b"
hikisu3 = ARGV[3] # "2"

しかし、こちらですと、オプションと値のセット(上記の例だと-a1, -b2)には関連性はありません。
値が数値かどうかのチェックも1から実装しなくてはなりません。

optparseを使えば、与えられたオプションごとに値をチェックすることができます。

オプションを受け付ける

たとえば、上記と同じようにaオプションとbオプションを受け付ける場合は、以下のように書きます。

$ ruby sumple.rb -a 1 -b 2
# sample.rb

# ライブラリoptparseの読み込み
require 'optparse'

# optpaserのインスタンス化
opt = OptionParser.new

# オプションの登録
opt.on('-a')
opt.on('-b')

# 受け取った引数がARGVに格納される
opt.parse(ARGV)
p ARGV # ["-a", "1", "-b", "2"]

すると、a, b以外のオプションを指定した場合はエラーにしてくれます。

$ ruby sample.rb -m 1
invalid option: -m (OptionParser::InvalidOption)
invalid option: m (OptionParser::InvalidOption)

破壊的メソッドにすると、ARGVにオプションは含まれません。

opt.parse!(ARGV)
p ARGV # ["1", "2"]

引数の入力をチェックする

以下のように書くと、aオプションの引数がなかった場合にエラーにしてくれます。

require 'optparse'

opt = OptionParser.new

opt.on('-a VAL')
opt.parse(ARGV)
p ARGV
$ ruby sample.rb -a
missing argument: -a (OptionParser::MissingArgument)

引数が必須でない場合は[]をつけます。

opt.on('-a [VAL]')

引数の型をチェックする

VALの後に型を指定することができます。

opt.on('-a VAL', Integer)

指定した型以外の値が入力された場合はエラーを出してくれます。

$ ruby sample.rb -a arg
invalid argument: -a arg (OptionParser::InvalidArgument)