Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

皆さん、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のマニュアルをよく見ると、じつは書いてあります。下の方に。

genta
ネットワーク屋(多分)
http://www.ihanet.info
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away