経緯
Rubyでカレンダーアプリを作成する際に,引数に任意の数値を渡すことでmacのcal
コマンドで表示されるようなカレンダーを表示したかったのでoptparseを使用しました。そこで私なりにoptparse
について調べてみました。
役割
- コマンドライン引数
コマンドライン引数は、ターミナルから実行時に引数を渡して読み込める仕組みです。 - 引数は文字列として出力されます。
OptionParser
以下
sample.rb
require 'optparse'
opt = OptionParser.new
#aに渡ってきた引数をvに格納
opt.on('-a') {|v| p v }
# 真偽値を表示。
opt.parse!(ARGV)
p ARGV
$ruby sample.rb -a foo
# この場合aに引数が渡っていますのでtrueを表示。そしてfooを表示
=>true
["foo"]
引数が2つの場合
sample.rb
require 'optparse'
opt = OptionParser.new
opt.on('-a') {|v| p v }
opt.on('-b') {|v| p v }
opt.parse!(ARGV)
p ARGV
$ruby sample.rb -a fooe -b baz
=>true
true
["foo", "baz"]
定義していないオプションを指定すると例外 OptionParser::InvalidOption が発生します。
sample.rb
ruby sample.rb -c
=>sample.rb:3:in `<main>': invalid option: -c (OptionParser::InvalidOption)
sample.rb:3:in `<main>': invalid option: c (OptionParser::InvalidOption)
OptionParser 自体は、どのオプションが指定されたかを記憶しないため、後の処理の方で、オプションによる条件判断を加えるには、 他のコンテナに格納します。
sample.rb
require 'optparse'
opt = OptionParser.new
# 引数を格納
OPTS = {}
opt.on('-a') {|v| OPTS[:a] = v }
opt.on('-b') {|v| OPTS[:b] = v }
opt.parse!(ARGV)
p ARGV
p OPTS
$ruby sample.rb -a foo bar -b baz
=>["foo", "bar", "baz"]
{:a=>true, :b=>true}
ARGV
sample.rb
require 'optparse'
option1 = ARGV[0]
option2 = ARGV[1]
puts "Option 1: #{option1}"
puts "Option 2: #{option2}"
$ruby sample.rb foo bar
=>Option 1: foo
Option 2: bar
# またはARGV.getoptsを使う
require 'optparse'
# 引数にオプションa, オプションbを指定
params = ARGV.getopts("a:b:")
p params
$ruby sample.rb -a foo -b bar
=>{"a"=>foo, "b"=>"bar"}
getoptsメソッド使うとワンラインでコードでオプションと引数を複数指定することができ、受け取ったものをHashとして( 例[a:]
)受け取ることができます。引数が必要なオプションにはコロンをオプションの後ろにつけます。オプションや引数をシンプルに扱うだけであればARGV.getoptsを使うと記述量が少なくて済みます。
参考サイト