From: gotoken@... (GOTO Kentaro) Date: 1998-10-31T18:57:20+09:00 Subject: [ruby-list:10536] Re: case with Class ごとけんです In message "[ruby-list:10530] Re: case with Class" on 98/10/31, aamine@dp.u-netsurf.ne.jp writes: >あおきです。 >あ、それはわかっているのですが、それだからこそ、String === String >が成立した方が、比較するのに便利ではないかと考えたわけです。 >また同時に、String === "this is str"も真の方が便利なので >両方併用したらどうか、と提案し また、もし String === Stringが成立すると >都合が悪いことがあるのなら教えて欲しい、という質問をしたのです。で、 この2段階の形の質問には答えませんでしたが、 ぼくは、クラスによって「中身」を持つ/持たないという 二分法を前提にしました。それで、 >>えっと、 === は case と Enumerable#grep で使われることように >>なっていますから、なにか「中身」を持つものがレシーバのときは >>所属性に関するメソッドになっていると理解しました。例えば、 > >Enumerable#grepで===を使っているために、String===Stringが成立すると >grepを使った時に余計なものまで集めてしまう、だからよくない、と理解した >のですがこれであってますでしょうか。 というよりは、上の前提のもとで Class は(インスタンス という)「中身」を持つものだと考えたわけです。 grep の存在が、String === String を成立させない根拠だ とは意図していません。そうではなくて、クラスを「中身」 の有無で二分して考えると現在の仕様に一定の法則を見る ことができる言いたかったのでした。 一方 Class のインスタンスのうち String だけを特別扱い にするのはやたら理解しにくいでしょうから、疑似 ruby で あおきさんの提案[10521] >kind_of? をチェックしたあとに、== でのチェックを行うというわけには >いかないのですか。 を書くと def Class def === (obj) obj.kind_of?(self) or if self.中身を持つクラス? then self == obj end end end となると思います。もっとも 『これをやると困る、という「積極的な否定理由」』 は見付かりませんが、強いていえばややこしすぎる気はします。 -- gotoken