原さん、お答えありがとうございます。

>> @comp = defined?(Complex) if !@comp
>> といった処理を書くべきでしょうか。
>
>そういうことですね。ただしここの comp はローカル変数でいいで
インスタンス変数にしたのは、コストがかかりそうなdefined?の回数を最小限
に抑えるためです。
#もしかしたら、defined?より!@compの評価の方が、コストがかかるのかも。

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

前者では、compの初期値として、nilが与えられている、と考えてよいのでしょ
うか。

>そもそも Vector の各要素を、ユーザーが実数として扱いたいのか
>複素数として扱いたいのか分からないですよね。4元数体の元かも
>しれないし、まったく別のオブジェクトとして扱いたいのかもしれ
>ない。
了解しました。
Vector#absでなく、Vector#rであるのも、その辺が理由なのでしょうか。

たびたびすいませんが、よろしくお願いします。

P.S.
原さんの『Ruby プログラミング入門』には大変お世話になっています。
ただ、http://www.ruby-lang.org/~sinara/nyumon/ に繋がりません。別ペー
ジに移転されたのでしょうか

田中 健太(TANAKA Kenta)
論理によって証明し、直感によって考え出す。