From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2002-07-03T16:22:58+09:00 Subject: [ruby-dev:17644] Re: substitution at when-clause けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev:17639] the message: "[ruby-dev:17639] Re: substitution at when-clause", on Jul/03 13:44(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >石塚さんは、はるか昔からそれを主張してましたね。もちろんはる >か昔から却下しつづけているので、いまでもそうなっていないわけ >なんですが。 (^^;;; では, 私も代替案を: case x when v1 ... when v2 ... else ... end は p = proc{|v| v === x} if p.call(v1) ... elsif p.call(v2) ... else ... end と解釈できますね? ですので, これをベースにcase文を拡張し, caseにブロックを渡せるようにする. case {|v| v === x} when v1 ... when v2 ... else ... end すると, >|case any_expr with :foo >|when a1 => r >| ... >|when a2 => r >| ... >|else >| raise .. >|end 相当は r = nil case {|v| r = v.foo(any_expr)} when a1 ... when a2 ... else raise .. end と書け, >|case any_expr with :< >|when 100 >|when 10 >|else >| ... >|end 相当は: case {|v| any_expr < v} when 100 ... when 10 ... else ... end って書けます. これなら, >このコードを見たときの動作は私には想像するのが難しいです。い >や、もちろん説明されたら分かりますけど、なんだか直感的でない。 >それはなぜかと考えるとやっぱり、 ということもないですし, >これ導入しても絶対に使いこなせませんって。で、訳のわからない >プログラムの原因になるだけだと思います。明示的な方が良い場合 >もあると思いますよ。 一応やりたいことは明示されていると思いますが? >あと、OO的観点からは「caseは良くない、polymorphismを使え」と >いう格言があるので、よりcaseを拡張したくないというのも、もし >からしたらあるかも。 これは, whenにクラスを渡したときの場合ですね? Ruby使っているとtype switchに頼ってしまうことが多いかも知れない. __ ..............................石塚 圭樹@日本ラショナルソフトウェア... ----------------------------------->> e-mail: keiju@rational.com <<---