お題
- ターミナルから
-a
,-l
,-r
,-alr
のオプションを引き取り、それぞれのオプションで条件分岐をしてメソッドを設定せよ - メソッドは
puts '適当な文字列'
でOK -alr
に関しては-ral
や-lra
などのように順番を変えても同じメソッドが動作すること
回答
require 'optparse' def select_option options = ARGV.getopts("alr") if options['a'] && options['l'] && options['r'] puts 'alr' elsif options['a'] puts 'a' elsif options['l'] puts 'l' elsif options['r'] puts 'r' else puts 'normal' end end select_option
説明
コマンドラインからオプションや引数を受け取る場合はOptionparserが便利。
class OptionParser (Ruby 2.6.0 リファレンスマニュアル)
ARGV.getopts("alr")
で「-a,-l,-r」というオプションを受け取れる。今回は引数は設定していない。
たとえば、-aというオプションを指定してp options
をすると、aというキー、値がtrueといったハッシュが返ってくる。
ruby ruby_basic.rb -a => {"a"=>true, "l"=>false, "r"=>false}
見ての通り、aだけがtrueで他のキーはfalseになる。
-alr
オプションを指定するとすべてがtrueになる。
ruby ruby_basic.rb -alr => {"a"=>true, "l"=>true, "r"=>true}
これを利用し、ターミナルのlsコマンド的な感じでオプションをつけてみる。
if options['a'] && options['l'] && options['r'] puts 'alr'
これでalrがどれもtrueだった場合、puts 'alr'
と表示される。
ruby ruby_basic.rb -alr => alr
もちろん、alrの文字がバラバラでも同じく動作する。
ruby ruby_basic.rb -lra => alr
反省
これだと、-al
といった2つ合体したオプションもできないことはないが、そのぶん条件分岐が多くなってぐちゃぐちゃなコードになる。拡張性が乏しい。
うーむ、Optionparserについてはまだまだ理解が浅く感じる。 今回の使い方が本質である自信はないなぁ・・・ まぁこれも学習のうちである。