【ruby】getoptsと条件分岐

はじめに

初ブログです。
みなさん、「getopts」これなんて読んでますか?
私は「ゲットップツ」?と思っていますが定かではありません。

ということで今回は、「getopts」と「キーワード引数を使ったメソッド」を組み合わせた条件分岐の書き方を知ったので、記事に残しておこうと思いました。

getopts と 条件分岐

require 'optparse'

option = ARGV.getopts('abc') # getopts : 引数をパース(分析)した結果を、Hash として返す。
p option # sample.rb -a => {"a"=>true, "b"=>false, "c"=>false}
p option # sample.rb -ab => {"a"=>true, "b"=>true, "c"=>false}
p option['a'] # sample.rb -a => true
p option['a'] # sample.rb -b => false
p option['b'] # sample.rb -ab => true

def xxx_or_yyy(option: false) # デフォルト値はfalse('yyy')を返す。
  option ? 'xxx' : 'yyy' # ・・①
end
p option['a'] # sample.rb -a => true # ・・②
p xxx_or_yyy(option: option['a']) # オプションaが選択されるとtrue(②)、①により'xxx'を返す。aを含まないオプションbやcが選択されたときはデフォルト値であるfalse('yyy')を返す。

その他

getoptsではない書き方
def parse_option(argv) # メソッド定義とのきは仮引数
  argv_option = {}
  OptionParser.new do |opt|
    opt.on('-a') { |v| argv_option[:a] = v }
    opt.on('-b') { |v| argv_option[:b] = v }
    opt.on('-c') { |v| argv_option[:c] = v }
    opt.parse!(argv)
  end
  argv_option
end
parse_option(ARGV) # メソッド呼び出しでの引数は実引数
キーワード引数に = を使う書き方もある
def xxx_or_yyy(option = false)
  option ? 'xxx' : 'yyy'
end
p xxx_or_yyy(option = option['a'])
三項(条件)演算子(?:)を使った条件分岐
option ? 'xxx' : 'yyy'

# 以下のif文を書き換えたもの。
if option
  'xxx'
else
  'yyy'
end

このようにシンプルなif文は1行で書くことができる。読みにくくならない範囲で使う。

elseやelsifがないパターンのif文は、後置ifを使って1行で書くことが多い。
xxx if 条件 # 条件がtrueのときxxxが実行される。
参考