読者です 読者をやめる 読者になる 読者になる

みんなのちからになりたい

コピペでブログラムつくっていきたい

gemとかでコマンド実行するときに--helpとかするとUsageなんちゃらとか出るアレをしたい

ruby argv parseとかでぐぐるとOptionParserを使うといいっぽい。
ここがすごいわかりやすい。
http://d.hatena.ne.jp/zariganitosh/20100210/1265785723

--helpとか--versoinはdefaultで実装されているらしい。
やってみる。

require 'optparse'

OptionParser.new do |opt|

  opt.on('-a') {|v| p v }
  opt.on('-b') {|v| p v }

  opt.parse!(ARGV)
end

p ARGV


C:\Work\www\workspace\ruby\labo\optparse>ruby optparse.rb
[]

C:\Work\www\workspace\ruby\labo\optparse>ruby optparse.rb -a
true
[]

C:\Work\www\workspace\ruby\labo\optparse>ruby optparse.rb --help
Usage: optparse [options]
    -a
    -b

まさにこれってのが出る。
optionにないやつを入れると例外が出る。

C:\Work\www\workspace\ruby\labo\optparse>ruby optparse.rb -c
optparse.rb:8:in `block in <main>': invalid option: -c (OptionParser::InvalidOption)
        from optparse.rb:3:in `new'
        from optparse.rb:3:in `<main>'

例外に飛ぶのはわかるんだけど、例外出してるやつみたことないのでrescueで拾ってるんだろうか。

C:\Work\www\workspace\ruby\labo\optparse>ruby -unko
ruby: invalid option -u  (-h will show valid options) (RuntimeError)

C:\Work\www\workspace\ruby\labo\optparse>gem -unko
ERROR:  Invalid option: -unko.  See 'gem --help'.

例外を拾ってみる。

require 'optparse'

OptionParser.new do |opt|

  begin
    opt.on('-a') {|v| p v }
    opt.on('-b') {|v| p v }
    opt.parse!(ARGV)
  rescue => e
    puts e
    exit 1
  end
end

p ARGV


C:\Work\www\workspace\ruby\labo\optparse>ruby optparse.rb -c
invalid option: -c

おお、ちゃんと出る。
でもどっちかっていうとinvalid optionのあとにUsageがでるほうがかっこいい気がするけどざっくりみた限り任意のオプションを表示させるメソッドはないっぽい。

optionの内容によって処理を変えたりとかする場合はhashかなんかに入れて置く。optionに引数を入れたり、任意にすることもできる([]が任意)

require 'optparse'

opthash = {}
OptionParser.new do |opt|

  begin
    opt.on('-a') {|v| opthash[:a] = v }
    opt.on('-b') {|v| opthash[:b] = v }
    opt.on('-c VAL') {|v| opthash[:c] = v }
    opt.on('-d [VAL]') {|v| opthash[:d] = v }
    opt.parse!(ARGV)
  rescue => e
    puts e
    exit 1
  end

end

p opthash
p ARGV


C:\Work\www\workspace\ruby\labo\optparse>ruby optparse.rb -a -c inoki -d
{:a=>true, :c=>"inoki", :d=>nil}
[]

勉強になる。