From: Kazuhiro HIWADA Date: 1998-10-31T16:32:33+09:00 Subject: [ruby-list:10533] Re: case with Class ひわだです。 (1) String === String が成立すると都合が悪いか? ですが、 Class#=== が kind_of? であることを意識した script がこれにより誤動作す ることはあまりなさそうに思えます。が、絶対とは言えないですね。 (2) Class#=== が kind_of? であるという認識の妨げになる? ってのもあると思います。scriptの字面ではなくClassの振る舞いやその methodの使われかたを認識しておくのがrubyに対する理解を深めることに繋が るのでは?とおもうので。 caseで String===String のようなクラス間の同一性判定をするのは確に面倒 ですが、僕はなんでもクラスにしてしまうので、 class MatchCase def initialize(v, m_id); @v, @mid = v, m_id end def ===(o); @v.send(@m_id, o) end end def Equal?(o); MatchCase.new(o, :equal?) end def Kind_of?(o); MatchCase.new(o, :kind_of?) end case String when Kind_of?(String) p "ouch!" when Equal?(String) p "ok!" end とかしちゃいます。(トリッキーですが ^^;) で、僕としてはrubyの「大抵のことがクラスで解決できてしまう」ところが気 に入っていろこともあり、(2)のような理由から、いまのままでいいんじゃな いかと思います。 --- これだけではなんなので、ちょっと提案なんですが、 case Hoge when proc{|o| Hoge.equal?(o)} p "ok!" end なんてのはどうでしょう。要するに class Proc def ===(o); call(o) end end をdefaultにしてしまおうってことですが。 -- 檜田 和浩 ( hiwada@kuee.kyoto-u.ac.jp )