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