From: Wakou Aoyama Date: 1998-11-01T03:35:56+09:00 Subject: [ruby-list:10548] Re: case with Class 青山です。 Sun, Nov 01, 1998 at 01:06:46AM +0900 において MAEDA Shugo さん曰く: > あおきさんの提案を採用すると、例えば、 > > 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.と表示してほしい。 これは順番の問題ですね。現在でも when Module なんていうのが Class より 前にあればそちらにマッチしてしまいますし、逆に Class が前にあれば、あ おきさんの提案を採用しても Class にマッチしますから。 >> Object === String => true >> Module === String => true >> Class === String => true >> String === String => false === というのが、それ自身を含むかどうか(以下、未満のような関係)で、どち らの意味が強いかというのが問題でしょうか。 > class Module > def ===(klass) > return klass.ancestors.include?(self) > end > end この場合は String は String にしかマッチしなくなりますが... >> String.ancestors => [String, Enumerable, Comparable, Object, Kernel] 先の Class にマッチさせたいという動作とは異なりますね。 青山 和光 Wakou Aoyama