From: shugo@... (MAEDA Shugo) Date: 1998-11-01T13:18:02+09:00 Subject: [ruby-list:10555] Re: case with Class 前田です。 >>>>> In [ruby-list:10548] >>>>> "wakou" == Wakou Aoyama wrote: >> あおきさんの提案を採用すると、例えば、 (snip) >> String is kind of String. >> >> と表示されてしまいます。 >> # ほんとはString is kind of Class.と表示してほしい。 wakou> これは順番の問題ですね。現在でも when Module なんていうのが Class より wakou> 前にあればそちらにマッチしてしまいますし、逆に Class が前にあれば、あ wakou> おきさんの提案を採用しても Class にマッチしますから。 いや、だから、コーディングした人が===がインスタンスかどうかの チェックだと理解している場合、先の例の順番で正しく動作すると 思いますよね? 二通りの意味を考えないといけないのは繁雑だと思います。 >> class Module >> def ===(klass) >> return klass.ancestors.include?(self) >> end >> end wakou> この場合は String は String にしかマッチしなくなりますが... >>> String.ancestors wakou> => [String, Enumerable, Comparable, Object, Kernel] wakou> 先の Class にマッチさせたいという動作とは異なりますね。 ですから、「互換性を考えければ」と書いたんです。 Classにマッチさせたい時は、 case obj.type when Class ... end と書けばよいと思います。 要は、違う動作を記述する時は、違う書き方の方がわかりやすい のではないか、ということです。 -- 前田 修吾