LoginSignup
0
0

Rubyのライブラリoptparseについて調べてみた

Posted at

はじめに

個人学習でカレンダプログラムを作成するにあたり、Rubyのライブラリoptparseを使用しました。使用するにあたり、Rubyの公式マニュアルを読むだけでなく、実際にプログラムを動かして、調べてみましたため、その記録を残します。

本題

optparseの機能について簡単に申し上げますと、Rubyプログラムを実行する際に指定しているオプションを扱うためのライブラリです。

例えば、ruby sample.rb -a foo bar -b bazのように-a foo bar -b baz箇所をsample.rbの中で使用したい場合に使用するライブラリです。以下はRubyの公式マニュアルから引用して、少しだけ内容を変えたプログラムになります。

sample.rb
require 'optparse'
opt = OptionParser.new

opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }

p ARGV

opt.parse!(ARGV)
p ARGV

色んなパターンでプログラムを実行してみました。

  • オプション及び引数を渡すパターン
ruby sample.rb -a foo bar -b baz
["-a", "foo", "bar", "-b", "baz"]
true
true
["foo", "bar", "baz"]
  • オプション及び引数を渡さないパターン
ruby sample.rb                  
[]
  • オプションのみを渡すパターン
ruby sample.rb -a                      
["-a"]
true
[]
  • opt.onで登録していないオプションを渡すパターン
ruby sample.rb -c
["-c"]
sample.rb:9:in `<main>': invalid option: -c (OptionParser::InvalidOption)
sample.rb:9:in `<main>': invalid option: c (OptionParser::InvalidOption)
  • 上記のプログラム実行したことでわかったこと。
    • ARGVはプログラムを実行した際に渡された引数が格納されていること。
    • opt.onで指定したオプション(-a-b)の引数("foo", "bar", "baz")をparse後に取得できること。
    • {|v| p v }はプログラムを実行する際に-aまたは-bのオプションを渡された際にtrueとなること。
    • オプションを渡さなかった際にはtrueが表示されないこと。
    • opt.onで指定していないオプションは渡せないこと。

今回実装するカレンダプログラムではオプションと引数で表示するカレンダーの月を指定できるようにしたいので、オプションを指定する場合は引数も渡せるようにしたいと考えております。
-aみたいなオプションだけ渡せてもあまり意味がないため、オプションを指定する場合は引数も必須で指定したいと思います。

そのような機能はあるかマニュアルを読んでみたところ、、、

opt.on('-a VAL')みたいにVALを書いてあげると、引数も必須にできます。VALでなくても任意の文字であれば機能しますので、VALである必要はありません。
実際にプログラムを修正して試してみます。

sample.rb
require 'optparse'
opt = OptionParser.new

opt.on('-a VAL') {|v| p v }
opt.on('-b') {|v| p v }

opt.parse!(ARGV)
p ARGV

  • 引数なしで実行した結果
ruby sample.rb -a
sample.rb:8:in `<main>': missing argument: -a (OptionParser::MissingArgument)
  • 1つの引数ありで実行した結果
ruby sample.rb -a 11   
"11"
[]
  • 2つの引数ありで実行した結果
ruby sample.rb -a foo bar -b baz
"foo"
true
["bar", "baz"]
  • 上記のプログラム実行したことでわかったこと。
    • 引数は必須になったこと。必須がないとエラーメッセージが出るようになった。
    • ブロック{|v| p v }ではtrueしか表示されていなかったが、-a VALに変更したことで、ブロックには引数が渡されるようになった。カレンダープログラムを実装する際には、引数で渡された値を変数に格納して、後続処理で利用する必要がある。
    • 引数に2つ(-a foo bar)渡したものの、1つ目しかブロックに渡されていない。

感想

公式ドキュメントを読むだけでは腑に落ちなかった箇所や細かい使用までは理解できませんでしたが、実際にプログラムを動かしてみることで、気づくことが多かったです。学習前はカレンダプログラムの引数を必須にしようという点は考慮しきれておりませんでしが、ライブラリの調査をしていく中で引数は必須にした方が良いという気づきにもなりました。

今後もドキュメントを読むだけでなく、実際に手を動かすことでRubyに関する理解を深めていきたいです。

0
0
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
0