皆さん、Rubyでコマンドライン引数のパース、どう書いてますか。
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
の登場です。
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%!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
include EmotionInCodeMarkupDSL
declaration do
'世 界 よ'
/ こ れ が /
%q<<<<<<<<<<<<<<<<<<<<< Rubyだッ!!!!!!!!!!!!!!!!!!!!!!! >>>>>>>>>>>>>>>>>>>>>
end
FAQ
長いオプションも使いたいんだけど
一応、できます。
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のマニュアルをよく見ると、じつは書いてあります。下の方に。