原です。 In [ruby-list:38449] TANAKA wrote: > >Vectorを作った後でcomplex.rbがロードされることも考えられるので、 > >初期化時点で決定するのは望ましくないような気がします。 > ということは、inner_productメソッドの定義のはじめに > @comp = defined?(Complex) if !@comp > といった処理を書くべきでしょうか。 そういうことですね。ただしここの comp はローカル変数でいいで しょう。それから、足し算毎に comp を評価するコストはかけ算な どに比べて低いので、あまり気にしなくていいかも。 > >Complexにはabs2というメソッドがあるので、Numericにも self*self > >という形でabs2が定義されていれば > これは、matrix.rbに > class Numeric > def abs2 > self * self > end > end > を追加すればよい、ということでしょうか。 そうですね。で、その上で v = 0 for e in @elements v += e.abs2 end Math.sqrt(v) を Vector#r の定義とするわけです。ほんとは r は inner_product を使って定義されるのがきれいですけど。 ところで、もともとの田中さんの Vector#inner_product は複素ベ クトルに対応してないのは不整備ではないかという問題は、なかな か難しい話で、どういう系でものを考えているか決まらないと、ど う処理していいか決まらないので、しかたない所もあります。 そもそも Vector の各要素を、ユーザーが実数として扱いたいのか 複素数として扱いたいのか分からないですよね。4元数体の元かも しれないし、まったく別のオブジェクトとして扱いたいのかもしれ ない。 でもまあ、現実的な対処法としては、今回のようにするか、 (1) Vector#inner_product はそのままにしておいて、 Class Vector def conjugate map{|x| x.conjugate} end end を用意して、その都度 a.conjugate.inner_product(b) とする。 (2) Vector#compex_inner_product を作る。 (3) ComplexVector クラスを作る。 (4) ライブラリ import-module や scope-in-state を使って一時的 に定義をすげ替える。 といったところでしょうか。いや、もっと色んな方法があると思う のだけど、なかなかこれで決定というのはないみたいです。