まつもと ゆきひろです

In message "[ruby-list:12737] Re: Making of Interval class."
    on 99/03/11, akendo / t3.rim.or.jp <akendo / t3.rim.or.jp> writes:

|二つお聞きしたいことがあります。
|一つは、initialize(a,b,c)で作れないのか苦闘しましたが、
|最初にArray#newに行ってしまって、引数は2つだよ、と怒られ
|ます。Step.new(40,360,20)で作れるようにはならないもので
|しょうか。

そーですねえ.Arrayを割り当てる時点(initializeが呼ばれる前)
で引数チェックしちゃいますからねえ.このStepをArrayのサブク
ラスにしなければすべてハッピーなんじゃないですかね.たとえば,
Arrayをインスタンス変数に持つオブジェクトとか.あるいは今回
はそもそもクラスを作る必要はなくて,Stepのような要素を持つ
Arrayを生成するメソッドをどこかに(関数的あるいはArrayクラス
に追加しちゃう)定義するのでもOKだったように思います.

大体,組み込みクラスのサブクラスを作るのはいろいろやっかいな
ことが起きやすいです.組み込みクラスの機能が多すぎるのもあり
ますし,実装上の都合から制約があることもあります.この制約は
だんだん取り除かれつつありますが,最後まで残るものもあるでしょ
う.

|もう一つは、できあがったものをcaseのwhen節で使うのですが、
|変数に代入すると、個々の要素が参照されなくなってしまいます。
|当たり前といえば当たり前ですが、これが、定数にいれると参照
|されるのは何故でしょうか。仕様です、でもいいのですが、いま
|いちArrayの扱われ方が分かってません。早くRuby本が出ないかな。

すみません.期待通り動かなかったプログラムと期待する動きを紹
介して頂けませんか? 私が1.2.3で試したところ

s = Step.new.init(40,360,20)
S = Step.new.init(40,360,20)

case 60
when Step.new.init(40,360,20)
  p s
end
case 60
when s
  p s
end
case 60
when S
  p S
end

の3つのcase文は同様に動きました.あ,ただし,この配列の中の
要素を使ったcaseはは1.3系では動かなくなりますから使わないほ
うが良いでしょう.1.3系では

case 60
when *s
  p s
end

のようにして明示的に配列の要素を展開する必要があります.

                                まつもと ゆきひろ /:|)