From: matz@... (Yukihiro Matsumoto) Date: 1999-03-11T13:06:56+09:00 Subject: [ruby-list:12740] Re: Making of Interval class. まつもと ゆきひろです In message "[ruby-list:12737] Re: Making of Interval class." on 99/03/11, 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 のようにして明示的に配列の要素を展開する必要があります. まつもと ゆきひろ /:|)