optparseの使い方について自分なりにまとめてみました。
はじめに
Rubyで作成したプログラムを実行する際に引数を渡して実行したい場合
$ sample.rb hello
のような形で実行するとプログラム内で配列ARGVで引数を使うことができます。
optparseでオプションを指定する
上記のようなやり方の他、optparseという標準ライブラリを使うことで引数の前にオプションを指定して実行する方法があります。
$ sample.rb -m hello
みたいな感じです。-m
がオプションになります。
この方法を使うメリットとして
- オプションによって引数が何を意味をするのかがわかりやすくなる。(バージョンを引数にしたい場合オプションを
-v
にするなど) - 引数が複数ある場合、通常のやり方だと定義した順番に引数を記述しないといけないが、オプションで指定する場合、順番を気にしなくて良い。
optparseの使用方法
以下利用方法になります。
1. プログラム内にoptparseを読み込む
require 'optparse'
組み込みライブラリではないのでrequireで読み込む必要があります。
2.optのインスタンスを作成する
opt = OptionParser.new
3. 取り扱うオプションを指定する
opt.on('-a')
実際にこの時点までの記述にp ARGV
を足したコード
require 'optparse'
opt = OptionParser.new
opt.on('-a')
p ARGV
をオプション指定して実行すると
sample.rb -a hello
# => ["-a", "hello"]
となり、-m
がオプションとして扱われておらず、ARGVには-m
とhello
の二つの引数が渡されているような状態になっています。
ここから-m
のオプションの部分を取り除いて、ARGV[0]=="hello"の状態にするには
4. opt.parseでオプションを取り除く
opt.parse!(ARGV)
上記の記述でARGVはオプション-m
を取り除いたあとの状態の配列になる
ちなみに!
をつけないと破壊的メソッドにならないため、
ARGVの状態は変わらない。
上記の記述p ARGVの前に加えて実行すると
sample.rb -a hello
# => ["hello"]
となり、引数が正しい形で受け取ることができる。
これでオプションを指定してプログラムに引数を渡すことが可能になった。
補足
オプションが複数あるときに指定されたオプションの有無によってプログラムの処理を変えたい場合
opt.on('-a') {|v| p v}
という記述をするとブロックのvの中にオプションがあった場合true,無しで実行された場合nilが入る
オプションを複数使う場合には
params = {}
などの空のハッシュを定義しておいて
opt.on('-a') {|v| params[:a] = v}
opt.on('-b') {|v| params[:b] = v}
opt.on('-c') {|v| params[:c] = v}
のように記述しておくと
各ハッシュの要素にキーに指定したオプションの有無が入るので
if params[:a]
のように条件分岐などする際に利用できる。
オプションをロングバージョンでも指定できるようにする
バージョンを指定するようなオプションの場合-v
などと指定することが多いと思うが、こういう場合に--version
でも同じく指定できるようにしたいときは
opt.on('-v', '--version')
とすると-v
と--version
のどちらでも指定できるようになる。
まとめ
以上になります。
自分なりに学習したことをまとめてみました。
間違っている部分がありましたら教えていただけると幸いです。
参考