はじめに
個人学習でカレンダプログラムを作成するにあたり、Rubyのライブラリoptparse
を使用しました。使用するにあたり、Rubyの公式マニュアルを読むだけでなく、実際にプログラムを動かして、調べてみましたため、その記録を残します。
本題
optparse
の機能について簡単に申し上げますと、Rubyプログラムを実行する際に指定しているオプションを扱うためのライブラリです。
例えば、ruby sample.rb -a foo bar -b baz
のように-a foo bar -b baz
箇所をsample.rbの中で使用したい場合に使用するライブラリです。以下はRubyの公式マニュアルから引用して、少しだけ内容を変えたプログラムになります。
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である必要はありません。
実際にプログラムを修正して試してみます。
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に関する理解を深めていきたいです。