Hi, At Tue, 7 Oct 2003 08:39:34 +0900, Weirich, James wrote: > > Does it surprise you? > > > > irb(main):001:0> ['a'].inject{break 'b'} > > => "a" > > Inject works on pairs of elements. Since your list has only one element, > there are no pairs. It's correct, the code has no iteration. > You can force one pair in the above example by explicitly supplying an > initial element ... > > ['a'].inject(''){break 'b'} # => 'b' But this doesn't work as Nathaniel expected. It returns last iteration value, "".
Index: enum.c =================================================================== RCS file: /cvs/ruby/src/ruby/enum.c,v retrieving revision 1.39 diff -u -2 -p -r1.39 enum.c --- enum.c 22 Aug 2003 17:43:57 -0000 1.39 +++ enum.c 7 Oct 2003 00:05:00 -0000 @@ -183,12 +183,12 @@ inject_i(i, memo) NODE *memo; { - if (memo->u2.value) { - memo->u2.value = Qfalse; + if (RTEST(memo->u2.value)) { memo->u1.value = i; } else { + memo->u2.value = Qnil; memo->u1.value = rb_yield_values(2, memo->u1.value, i); } - return Qnil; + return memo->u2.value = Qfalse; } @@ -207,6 +207,6 @@ enum_inject(argc, argv, obj) memo = rb_node_newnode(NODE_MEMO, Qnil, Qtrue, 0); } - rb_iterate(rb_each, obj, inject_i, (VALUE)memo); - n = memo->u1.value; + n = rb_iterate(rb_each, obj, inject_i, (VALUE)memo); + if (!memo->u2.value) n = memo->u1.value; rb_gc_force_recycle((VALUE)memo); return n;
-- Nobu Nakada