From: shugo@... (MAEDA Shugo) Date: 1998-11-01T01:06:46+09:00 Subject: [ruby-list:10544] Re: case with Class 前田です。 >>>>> In [ruby-list:10530] >>>>> "aamine" == aamine wrote: aamine> あ、それはわかっているのですが、それだからこそ、String === String aamine> が成立した方が、比較するのに便利ではないかと考えたわけです。 aamine> また同時に、String === "this is str"も真の方が便利なので aamine> 両方併用したらどうか、と提案し また、もし String === Stringが成立すると aamine> 都合が悪いことがあるのなら教えて欲しい、という質問をしたのです。で、 あおきさんの提案を採用すると、例えば、 case obj when String puts "#{obj.inspect} is kind of String." when Array puts "#{obj.inspect} is kind of Array." when ... ... when Class puts "#{obj.inspect} is kind of Class." end というコードがあった時にobj == Stringの時に String is kind of String. と表示されてしまいます。 # ほんとはString is kind of Class.と表示してほしい。 やはり===に二つの意味を持たせるのは、混乱の元になるのでは ないでしょうか。 互換性を考えないならば、 class Module def ===(klass) return klass.ancestors.include?(self) end end とした方が便利かもしれませんね。 どのクラスのサブクラスか知りたい時は、 case klass when String ... when Array ... end どのクラスのインスタンスか知りたい時は、 case obj.type when String ... when Array ... end もっとも、どのクラスのインスタンスか知りたい場合の方が 多いと思うので、今の仕様が妥当なのかもしれません。 -- 前田 修吾