From: HQss_YasuiS/hq_ss@... Date: 1999-02-05T14:41:13+09:00 Subject: [ruby-list:11922] Re: to_i,to_s の素朴な疑問 安井です。 >まつもと ゆきひろです > >むかしは必要なかったのです.Perl同様適当に変換してました.が, >それでは型にまつわるバグの発見が遅れる一方ですから,ちゃんと >型を合わせる方法を選ぶようになったのです. あっそうだったんですか。なら、是非復活してもらいたいですね。 # 用法に注意すれば全然OKだと思うし。 # あと、両方とも活かしておくという選択肢もあったりね(笑) これについて過去に議論があったのなら、バックナンバーを教えて もらえませんか? >オブジェクト指向言語にとって,ある値の型は非常に重要な要素で >すから無視する方向にはいかない方が良いのではないだろうかと考 >えています. おっしゃるとおりです。全然無視してませんよ。 確認しておきたいのは、議論の対象は「レシーバ」ではなく「メッ セージに与える引数の多態性」です。 この方法は、Matrixクラスなどで既に使われています。他にもある かも知れません。 >ですが, > > def foo(a) > b=a+1 # b = "11" or b = 2 > return "x"*b # "x"*11 or "x"*2 > end > > foo("1") # => "xxxxxxxxxxx" > foo(1) # => "xx" > >となるとちょっとまずい気がしません? 全然です。例が悪すぎると思います。 まず、レシーバが何なのか分りません。それから、例題が非現実的 ではないでしょうか。 >オブジェクト指向の特長として演算子が同じでも左辺の型によって >動作が違う(動的結合)と,結局右辺の型がなんであるか意識しない >と正しい結果が出てくれません.でしたら,正しくないかもしれな これは当然ですよね。 メッセージの引数が何であるかは分っていなければなりませんから。 >い結果でつっ走ってくれるよりは,エラーが出てくれた方が良いだ >ろうというのが設計者の判断です. 予期しないオブジェクトがプロトコルにつかわれたらエラーにする のは当然です。というかそれしか方法はありませんよね。 もう一度簡単な例を挙げますのでこれで議論しませんか。 簡略化した点オブジェクトです。 -------------------------------------------------- class Point def initialize(name,x=0,y=0) @name, @x, @y = name, x, y end def x @x end def y @y end def +(p) case(p) when Numeric @x += p; @y += p when Point @x += p.x; @y += p.y end end def print printf "%s(%d,%d)\n",@name,@x,@y end end -------------------------------------------------- 点オブジェクトのテストプログラムです。 -------------------------------------------------- require 'point' p1 = Point.new('p1',10,20) p2 = Point.new('p2',30,40) p3 = Point.new('p3',50,60) p1 + 10 p2 + p3 p1.print p2.print -------------------------------------------------- % test.rb p1(20,30) p2(80,100) % この場合、+メソッドの引数に、NumericとPointを許し、他はエラー になります。(エラーになっていいのです!) StringやNumericクラスの演算メソッドもこれと同様にならないかな と思うのです。 # Numericのサブクラスを自作すればすむことかも知れませんが、 # 常にrequireしなければならないので面倒です。 - - - - - - 安井@日立造船 e-mail: yasuisu@omssv.hq.hitachizosen.co.jp