たのしいRuby 第9章 例外処理
第2部の最後です。そろそろRubyに慣れてきました。
wcで例外処理
wcクローンで例外のお勉強。
wc.rb
#!/usr/bin/ruby -w if ARGV.size == 0 STDERR.puts "Usage : ./wc.rb [FILES]..." exit 1 end lines = 0 words = 0 chars = 0 ARGV.each do |file| begin input = open(file) l = 0 w = 0 c = 0 while line = input.gets l += 1 c += line.size line.sub!(/^\s+/, "") array = line.split(/\s+/) w += array.size end input.close printf("%8d %8d %8d %s\n", l, w, c, file) lines += l words += w chars += c rescue => ex STDERR.puts ex.message exit 1 end end printf("%8d %8d %8d %s\n", lines, words, chars, "total")
サンプルには引数の処理が無かったので追加しました。split,subに正規表現が使えるのはさすがです。
Rubyのソースは何行かなぁ・・・
% ./wc.rb ~/src/ruby/ruby1.8/ruby/*.c 1960 4587 39824 /home/tanaka/src/ruby/ruby1.8/ruby/variable.c 52 117 1446 /home/tanaka/src/ruby/ruby1.8/ruby/version.c 77856 224377 1788113 total % wc ~/src/ruby/ruby1.8/ruby/*.c 1960 4587 39824 /home/tanaka/src/ruby/ruby1.8/ruby/variable.c 52 117 1446 /home/tanaka/src/ruby/ruby1.8/ruby/version.c 77856 224377 1788113 total
うっは、本物の方が断然早いっす。パフォーマンスチューニングもやらないとなぁ・・・。
サンプルのバグ発見してしまった・・・サイズの処理が間違ってる。
『たのしいRuby 第2版』正誤表 次の版では直っているそうです。サポートページをブクマしとこう。
例外処理の省略
ちとハマった。
上のwcで省略しようと思ったら、do~endだった。"メソッド"の時省略可能。
つまり、def〜begin〜rescue〜end〜endの時、def〜rescue〜endに省略可能。便利。
9章おわりぃ~
例外処理は真面目にやったこと無かったので、ちゃんとやろうと思う。
vimの補完設定を見直した。
~/.vim/autoload/rubycomplete.vimを見たら、色々設定があったので見直した。
" complete {{{ set completeopt=menu,preview,longest aug Complete au! au FileType python setl omnifunc=pythoncomplete#Complete au FileType javascript setl omnifunc=javascriptcomplete#CompleteJS au FileType html setl omnifunc=htmlcomplete#CompleteTags au FileType css setl omnifunc=csscomplete#CompleteCSS au FileType xml setl omnifunc=xmlcomplete#CompleteTags au FileType php setl omnifunc=phpcomplete#CompletePHP au FileType c setl omnifunc=ccomplete#Complete au FileType ruby,eruby setl omnifunc=rubycomplete#Complete au FileType ruby,eruby comp ruby au FileType ruby,eruby let g:rubycomplete_rails = 1 au FileType ruby,eruby let g:rubycomplete_classes_in_global = 1 au FileType ruby,eruby let g:rubycomplete_classes_in_global = 1 au FileType ruby,eruby let g:rubycomplete_include_object = 1 au FileType ruby,eruby let g:rubycomplete_include_objectspace = 1 au FileType ruby,eruby setl dictionary=$HOME/.vim/dict/ruby.dict aug END " }}}
今のところこんな感じ。かなり快適補完になってきました。
足りないところは辞書で補っていく予定です。