出沢です

# 反対意見を述べているのではありません。

》From: sinara / blade.nagaokaut.ac.jpSubject: [ruby-list:1610] Re: jchopDate: Mon, 6 Jan 97 21:14:26 JST

> 原です。
> 
> From: Sinichiro Dezawa <dezawa / miya.fujifilm.co.jp>
> > > 最近、「メソッドが nil に対して用意されていない事で例外が起こる」
> > > という事が、ずいぶん便利に思えてきました。この例外が起こらない様
> > > にプログラムを書くことで、論理がすっきりするみたいです。例えば
> > 
> > わからん 。
> > 詳しく説明してもらえます?
> 
> いえ、別に難しいことを言っているんでは無くて、変な所に nil が
> 出てきたたら、その前のコードでバグを入れている可能性が高いと
> いうことです。
> 
> 例えば fname = "/foo/bar" というファイルのベースのファイル名
> を bar の文字数をカウントしたい時、
> 
> fname =~ /[^\/]+$/
> print $&.length, "\n"
> 
> と書けますが、これに fname = "/foo/bar/" を食わせると、例外で
> 止まります。つまりこれは、趣旨に合わない入力がなされている事
> を教えてくれてるわけです。(Perl だったら素通しで 0 を返すで

この例はバグというよりは 意図しない入力がされた って事ですよね。
で、入力チェックをどうするか って問題があって、
1 プログラムを止めてしまう
2 入力が正しくないとして、正しい入力を促す。
   または処理を中断して、次の入力を待つ
3 入力が正しくなかった時の定められた処理をする。

の3つぐらいかな、やれる事は。
で、3番目はそのルーチンの目的によって内容は異なるわけで、
   fname = "/foo/bar/" のときはサイズ 0 で処理するのが嬉しい
事だってあるでしょう。

だから、例外で止まってしまう のは debug には役立ちますが、
実用アプリでは困ってしまうのです。

で、この場合は 例外のトラップを設ければ解決ではありますが。
# 例外のトラップなど使える環境では無かったから今まで思い付かなかった

> foo が nil の時、 foo < "bar" は、やはり ruby に叱られるけれど、
> 出沢さんの様に意識的に nil を使っているのなら違いますが、多くの
> 場合、その前のアルゴリズムが間違っているんじゃないでしょうか。

はい、アルゴリズムに問題があるのです。
  かな、、、
  ruby/*.c からクラス定義と、メソッド定義を抜き出して、整理するって時、
  指定した *.c では定義されていないクラスを親に持つ事があるわけ。
  すると 親をたどる時などに引っかかる。

でもね、
プログラムって
    『早く動く』プログラムが欲しい  時
と
    早く『動くプログラム』が欲しい  時
が あり、
同時に
    やり方はどうであれ、早く正しい結果 が欲しい
時もあるのです。
で、nil が入り込んでしまう アルゴリズム を精密にするよりは
紛れ込んだ nil を押え込む 方を取りたい時もあるわけです。
で、今回はこれに近いと。

> 
> それに nil をマイナス無限大にするのもかなり恣意的なもので、プラ
> ス無限大にしてほしい人も結構いるんじゃないかしら。

なる。