From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1998-02-24T16:58:36+09:00 Subject: [ruby-list:6714] Re: coerce けいじゅ@日本ラショナルソフトウェアです. In [ruby-list :06710 ] the message: "[ruby-list:6710] Re: coerce ", on Feb/24 16:02(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです > >|実は, 私もMatrixを作りはじめた時に, rubyのcoerceでは駄目かと思ったんで >|す... でも, その時, 松本氏もこの解決案を出したと思いましたが... > >すっかり忘れてました(健忘症か).^^;;; まあ, だいぶ立ちますし(^^;; >|私はもっとエレガントな方法が良かったんですが... > >まあ,中間クラスを作る方法がエレガントでないのは確かですが, >genericityや他の言語のcoerce(片方しか変換できない)よりはマシ >ということで許して下さい.お願い. いや. 全然許しちゃいます. この仕様は結構良いと思っていますよ(^^;;; 数システムにクラスを自由に追加できるところが良いですね. Smalltalkの genericiry/coerceでは, クラスの変換順序が(genericityによってsequenceに) 決まってしまいます. それと比べて, rubyの数システムはネットワーク状に変 換系列が定義できるようになるので, いろいろと応用が効くと思っています. ただ, 問題は, 数システムに融合させるために定義するべきメソッドが多くて 基本的にタイプスイッチを行なわなくてはならなくて既存クラスとの兼ね合い をいろいろ考えなくてはならないってことですかね. 逆にSmalltalkだとこの 辺り楽なんですが... ex. Matrix#- def -(m) case m when Numeric Matrix.fail ErrOperationNotDefined, "-" when Vector m = Matrix.column_vector(m) when Matrix else x, y = m.coerce(self) return x - y end Matrix.fail ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size rows = (0 .. row_size - 1).collect { |i| (0 .. column_size - 1).collect { |j| self[i, j] - m[i, j] } } Matrix.rows(rows, FALSE) end __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---