From: wada@...2.off.ne.jp Date: 2001-04-04T17:27:09+09:00 Subject: [ruby-list:29100] Re: nil.to_f ruby をはじめて 2 日目の和田です. まつもとさんご本人からお返事頂けて光栄です. From: matz@zetabits.com (Yukihiro Matsumoto) Subject: [ruby-list:29088] Re: nil.to_f Date: Wed, 4 Apr 2001 08:28:56 +0900 > まつもと ゆきひろです > > In message "[ruby-list:29079] nil.to_f" > on 01/04/04, wada@mail2.off.ne.jp writes: > > |さて, 早速質問なのですが, > | > |nil.to_i => 0 > | > |の method が定義されていて, > | > |nil.to_f > | > |の method が定義されていないのはなにか理由があるのでしょうか. > > nil.to_iが過去との互換性のための盲腸のようなものだから、です > かね。だから、変えるならむしろnil.to_iをなくすべき。 過去ログを調べてみると, nil に to_i や to_f の method を定義すべきでは ないというのは, ruby がよりエラーを検出できる方向に向かっているための ようですね([ruby-list:9182]). > Perlと違って型の違いをちゃんと認識する(必要に応じて変換する) > のがRuby流です。例外が起きたら捕捉すればよいわけですし。 > > val = (data[num].to_f rescue 0.0) このへん, 勘違いしてました. http://www.ruby-lang.org/ja/testimony.html を読んで, ruby では Perl のように終始変数の型を気にしたくない人向けだ と思ってしまっていました. ところで, 以下のようなスクリプト % cat test.rb while gets $_ = split 0.step(2, 1) do |i| begin $_[i] = $_[i].to_f rescue $_[i] = 0.0 end end STDOUT << "#{$_[0]}\t#{$_[1]}\t#{$_[2]}\n" end を実行してみたのですが, % ruby test.rb 1 2 3 (標準入力) 1.0 2.0 3.0 (標準出力) 1 2 (標準入力) tmp3.rb:5: undefined method `to_f' for nil (NameError) from tmp3.rb:3:in `step' from tmp3.rb:3 となって rescue されませんでした. 何がまずいのでしょうか. # 今のところ nil.to_f については, Object クラスに to_s が定義されてい # て nil.to_s => "" となってエラーにならないことを利用して, # data[num].to_s.to_f なんてことをやって nil.to_f のエラーでとまらない # ようにしています (nil.to_s.to_f => 0.0).