有馬です。

matz / zetabits.com (Yukihiro Matsumoto) wrote

| |まともな型システムを獲得した瞬間に(つまりRubyそのものが体現してる)
| |要らなくなった概念であるかのように思っていました。
| 
| Rubyが「まともな型システム」かどうかは疑問ですが、例外が発生
| しない方が楽な場合があるというのは確かですね。getsとreadline
| とか。

例外が発生しない方が楽な場合があるのはわかります。
しかし rescue ArgumentError で捕まえる方が楽な場合もあるかと考えます。
入力ファイルのスキャナを書いたとき、C だと strtol(), strtod() で
チェックしていたのですけど、String#to_i, #to_f だと 0 になってしまいます。

| あとはnilを返すか0を返すかですが、別に伝統に逆らう理由はない
| だろうということで0を返してます。

変換できなかったらそれを伝える方が親切だというのは、理由になりませんか?
演算の途中で使った場合に原因をつきとめるのが困難だから nil にはメソッドを
持たない方向へ進めたのだと理解しています。

def tosec(st)
  st[0,3].to_i * 3600 + st[3,2].to_i * 60
end

p tosec( "+0900" )	#=> 32400
p tosec( "JST" )        #=> 0      もし to_i が nil を返せば Error

to_i で例外を起こさなくても、戻り値の nil を不適切に扱えばそこで例外が起きるので、
現行仕様の変更に抵抗がありましたら、メソッドの新設ならいかがでしょう。

String#to_i?(defalut=nil)
String#to_f?(defalut=nil)

s1 = "1"
sa = "a"
s1.to_i?         #=> 1
sa.to_i?         #=> nil
sa.to_i?(0)      #=> 0
sa.to_i?("Bad")  #=> "Bad"  # すでに int じゃないし。

--
 有馬 康弘 <fit0298 / fitec.co.jp>