Just do IT

思うは招く

Ruby基礎問題100本ノック#7 Optionparserを使って条件分岐してメソッドを使う

お題

  • ターミナルから-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についてはまだまだ理解が浅く感じる。 今回の使い方が本質である自信はないなぁ・・・ まぁこれも学習のうちである。