220
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

ARGVの処理にOptionParserを使ってるライバルをバックミラーから高速に消し去るARGV.getoptsの使い方

皆さん、Rubyでコマンドライン引数のパース、どう書いてますか。

very_boring_and_waste_of_time_option_parsing.rb
require 'optparse'

params = {}

opt = OptionParser.new
opt.on('-a') {|v| params[:a] = v }
opt.on('-b') {|v| params[:b] = v }
opt.on('-c file_name') {|v| params[:c] = v }
opt.parse!(ARGV)

p params
% ./very_boring_and_waste_of_time_option_parsing.rb -a -c /tmp/file
{:a=>true, :c=>"/tmp/file"}

% ./very_boring_and_waste_of_time_option_parsing.rb -h
Usage: very_boring_and_waste_of_time_option_parsing [options]
    -a
    -b
    -c file_name

だいたい、こんな感じですよね。
引数を3つ取るだけのこの処理、12行を要していますね。

「12行」のカウントには空行も入っているけど、こんな長い塊、空行を入れないと読めたもんじゃないから、やっぱり12行は必要です。

こういうの書いていると、こんな感じな気分になってきて、だんだん憂鬱になってきませんか。

  • いちいちブロックを書く必要があるのが、もう、超うっとうしい
  • しかも、ブロックの中身はだいたい同じだし
  • オプションが増えるたびに、似たような行を増やさないといけないし
  • だいたい、「あ、変数名、paramsから変えようかな」とか思っただけでもう死にたくなるし
  • こんなの覚えてられないから、結局、毎回マニュアル見るはめになる。超だるい
  • かといって、この程度の処理にgemを使うのもだるいし
  • こんな単純作業みたいなコーディング強いられるの、Rubyっぽくないよね

それにしても、もう少し、気軽に書けないものでしょうか。できれば標準ライブラリの機能だけで。

そんな素敵な方法、実は、もうあります。

では、ARGV.getoptsの登場です。

its_the_ruby_way.rb
require 'optparse'
params = ARGV.getopts('abc:')
p params
% ./its_the_ruby_way.rb -a -c /tmp/file
{"a"=>true, "b"=>false, "c"=>"/tmp/file"}

% ./its_the_ruby_way.rb -h
Usage: its_the_ruby_way [options]
    -a
    -b
    -c VAL

うおおおおおおおおおおおおおおおおおおおおおおおおお

12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!! 12行が3行に爆縮!!

ヒャッハーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

ソースコード

行数

圧縮率

なんと

驚異の

75%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ruby
include EmotionInCodeMarkupDSL
declaration do





                                  '世  界  よ'





/                     こ               れ               が                    /





%q<<<<<<<<<<<<<<<<<<<<<  Rubyだッ!!!!!!!!!!!!!!!!!!!!!!!  >>>>>>>>>>>>>>>>>>>>>





end

FAQ

長いオプションも使いたいんだけど

一応、できます。

its_the_ruby_way.rb
require 'optparse'
params = ARGV.getopts('abc:', 'alpha', 'brabo', 'charlie:/tmp/default_file')
p params
% ./its_the_ruby_way.rb --alpha -c /tmp/hoge
{"a"=>false, "b"=>false, "c"=>"/tmp/hoge", "alpha"=>true, "brabo"=>false, "charlie"=>"/tmp/default_file"}

長い版のオプション(‘--charlie’)には、デフォルト値も指定できます。

短い版のオプション(‘-a’とか)と、長い版のオプション(‘--alpha’とか)の同一視とか、気の利いた機能はないようですが、まぁ、些事と言えましょう。

ハッシュのキーは文字列? シンボルにできないの?

はい。
あきらめましょう。

ヘルプ、もうちょっとなんとかならないの?

はい。
あきらめましょう。

とはいえ、--helpの結果をコピペして、ヘルプを出すメソッドをでっちあげておくなりすれば、たいてい間に合うでしょう。書き捨てのつもりのスクリプトとか、そういう場合は特に。

そんなの、マニュアルに書いてあったっけ?

optparseのマニュアルをよく見ると、じつは書いてあります。下の方に。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
220
Help us understand the problem. What are the problem?