Method: Enumerable#reduce

Defined in:
enum.c

#inject(initial, sym) ⇒ Object #inject(sym) ⇒ Object #inject(initial) {|memo, obj| ... } ⇒ Object #inject {|memo, obj| ... } ⇒ Object #reduce(initial, sym) ⇒ Object #reduce(sym) ⇒ Object #reduce(initial) {|memo, obj| ... } ⇒ Object #reduce {|memo, obj| ... } ⇒ Object

Combines all elements of enum by applying a binary operation, specified by a block or a symbol that names a method or operator.

If you specify a block, then for each element in enum the block is passed an accumulator value (memo) and the element. If you specify a symbol instead, then each element in the collection will be passed to the named method of memo. In either case, the result becomes the new value for memo. At the end of the iteration, the final value of memo is the return value for the method.

If you do not explicitly specify an initial value for memo, then the first element of collection is used as the initial value of memo.

# Sum some numbers
(5..10).reduce(:+)                             #=> 45
# Same using a block and inject
(5..10).inject { |sum, n| sum + n }            #=> 45
# Multiply some numbers
(5..10).reduce(1, :*)                          #=> 151200
# Same using a block
(5..10).inject(1) { |product, n| product * n } #=> 151200
# find the longest word
longest = %w{ cat sheep bear }.inject do |memo, word|
   memo.length > word.length ? memo : word
end
longest                                        #=> "sheep"

Overloads:

  • #inject(initial, sym) ⇒ Object

    Returns:

  • #inject(sym) ⇒ Object

    Returns:

  • #inject(initial) {|memo, obj| ... } ⇒ Object

    Yields:

    • (memo, obj)

    Returns:

  • #inject {|memo, obj| ... } ⇒ Object

    Yields:

    • (memo, obj)

    Returns:

  • #reduce(initial, sym) ⇒ Object

    Returns:

  • #reduce(sym) ⇒ Object

    Returns:

  • #reduce(initial) {|memo, obj| ... } ⇒ Object

    Yields:

    • (memo, obj)

    Returns:

  • #reduce {|memo, obj| ... } ⇒ Object

    Yields:

    • (memo, obj)

    Returns:



635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
# File 'enum.c', line 635

static VALUE
enum_inject(int argc, VALUE *argv, VALUE obj)
{
    NODE *memo;
    VALUE init, op;
    rb_block_call_func *iter = inject_i;
    ID id;

    switch (rb_scan_args(argc, argv, "02", &init, &op)) {
      case 0:
  break;
      case 1:
  if (rb_block_given_p()) {
      break;
  }
  id = rb_check_id(&init);
  op = id ? ID2SYM(id) : init;
  argc = 0;
  init = Qnil;
  iter = inject_op_i;
  break;
      case 2:
  if (rb_block_given_p()) {
      rb_warning("given block not used");
  }
  id = rb_check_id(&op);
  if (id) op = ID2SYM(id);
  iter = inject_op_i;
  break;
    }
    memo = NEW_MEMO(init, argc, op);
    rb_block_call(obj, id_each, 0, 0, iter, (VALUE)memo);
    return memo->u1.value;
}