From: Nobuyoshi Nakada Date: 2006-11-07T00:12:33+09:00 Subject: [ruby-dev:29882] Re: case/when splat なかだです。 At Mon, 6 Nov 2006 14:35:02 +0900, SASADA Koichi wrote in [ruby-dev:29860]: >  次のプログラムは :ok と出力するべきだと思うのですが、ruby 1.9.0 > (2006-11-03) [x86_64-linux] では :ng2 と出力されます。 べきだと思います。 >  次のプログラムは :ok と表示されるのかなーと思っていたんですが、:ng と > 表示されます。そんなもんでしょうか。 そんなもんでもないでしょう。 when_check()の構造が少々いまいちっぽいですが。 Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.955 diff -p -U 2 -r1.955 eval.c --- eval.c 6 Nov 2006 10:27:58 -0000 1.955 +++ eval.c 6 Nov 2006 14:34:38 -0000 @@ -2701,8 +2701,8 @@ unknown_node(NODE *volatile node) when_cond(VALUE v1, VALUE v2) { - if (v1 == Qundef) { - return RTEST(v2); + if (v1 != Qundef) { + v2 = rb_funcall2(v2, eqq, 1, &v1); } - return RTEST(rb_funcall2(v2, eqq, 1, &v1)); + return RTEST(v2); } @@ -2724,5 +2724,7 @@ when_check(NODE *tag, VALUE val, VALUE s break; case NODE_SPLAT: - elm = splat_value(rb_eval(self, tag->nd_head)); + tag = tag->nd_head; + splat: + elm = splat_value(rb_eval(self, tag)); for (i=0; ind_head, val, self)) return Qtrue; - return when_check(tag->nd_body, val, self); + tag = tag->nd_body; + goto splat; case NODE_ARGSPUSH: if (when_check(tag->nd_head, val, self)) return Qtrue; -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦