たのしい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
" }}}

今のところこんな感じ。かなり快適補完になってきました。

足りないところは辞書で補っていく予定です。