原です。

In [ruby-list:38452] TANAKA wrote:

> インスタンス変数にしたのは、コストがかかりそうなdefined?の回数を最小限
> に抑えるためです。
> #もしかしたら、defined?より!@compの評価の方が、コストがかかるのかも。

どうでしょうね。実験してみないとわからないなあ。たしかに気に
なりますけど。自分が複素ベクトルであるかどうかという情報を自
分で持つのはもっともではあります。でもそれなら、ComplexVector 
クラスを作るのが筋という気もするし、、、さしあたって

  class Vector
    def inner_product(v)
      if defined?(Complex)
        ...
      else
        ...
      end
    end
  end

でいいんじゃないかな。... 部分のコードの共有ができないのは
ちょっと残念ですが。ただこれを matrix.rb に記述してもらうの
は難しいかも。一応 Complex の事は知らないとして matrix.rb
は作られているみたいだから。

> ところで、上記のコードでは、インスタンス変数の「定義は要らない」という
> 特徴を使っているつもりだったのですが、
> comp = defined?(Complex) if !comp
> とも書けるようですね。当然、
> if !comp then comp = defined?(Complex) end
> は、エラーになりますが。
> 
> 前者では、compの初期値として、nilが与えられている、と考えてよいのでしょ
> うか。

あ、すいません。comp をローカル変数にするときは、if !comp は
取ります。この場合、実行前のスクリプトの解釈の段階で comp は
定義されてしまってるのです。『入門』の p.174 にもあります。

> P.S.
> 原さんの『Ruby プログラミング入門』には大変お世話になっています。

マイド。

> ただ、http://www.ruby-lang.org/~sinara/nyumon/ に繋がりません。別ペー
> ジに移転されたのでしょうか

サーバー更新の時に削除されました。そのうち復活させます。(^^;