From: Masahiro Tanaka <masa / stars.gsfc.nasa.gov>
Subject: [RubyUnit:2479] Re:Re:児玉さん
Date: Wed, 10 Jan 2001 11:28:46 -0500

るびきちです。

# こっちへ移動。

> > matrix.rbの場合は、Scalarというprivate classを作っていましたね。
> > ちなみに俺の実装ではScalarをcoerceすると0x0行列という仮の行列にしてます。
> > そしたらエラーになりますし。
> 
> NArrayでも、Float * NArray などのときはcoerceを使ってFloatを
> NArrayScalar(要素数1のNArray)に変換しています。
> さらに NArray * NMatrix とやりたいときに、
> NArray は NMatrix を知らないので、coerce_rev を呼びます。
> (NArrayはScalarの配列という立場)
ということはmatrix.rbとかを使うときには、Matrix#coerce_revを
定義する必要があるということですね。

> class NArray
>   def *(other)
>     case other
>     when 自分の知っているクラス
>       演算
>     else
>       other.coerce_rev( self, :*.to_i )
>     end
>   end
> end
> 
> class NMatrix
>   def coerce_rev(other,id)
>     case id
>     when :*.to_i
>       case other
>       when 自分の知っているクラス
>         return 演算結果
>       end
>     ...
>     end
>     raise # エラー
>   end
> end
そういえばどこかの議論で演算子つきのcoerceがあったような。

この場合はNMatrixがNArrayを「知って」いて、
その逆ではないということか。

「知って」いるものが増えてくるとwhenの数が増えてヤな感じ。


るびきち☆
http://www.ruby-lang.org/~rubikitch