Как сложить элементы массива?

Вместо того, чтобы решить эту конкретную проблему, давайте решим более общий случай. Первое, что можно сделать, написать метод, который бы
перебирал все элементы объекта Enumеrable и возвращал бы единый результат. В Smalltalk такой метод называется inject, и мы назовем его также:

  module Enumerable
    # inject(n) { |n, i| ...}
    def inject(n)
      each do |i|
        n = yield(n, i)
      end
      n
    end
  end

Заметьте, что метод был добавлен в модуль Enumerable. Это значит, что все, что включает в себя Enumerable, может использовать inject.Но как? inject принимает единственный аргумент n и блок. Для каждого элемента Enumerable объекта вызывается блок, в который передается n и сам элемент. Результат работы блока присваивается переменной n. Таким образом, чтобы определить метод sum, можно написать так:

  module Enumerable
    def sum
      inject(0) {|n, i|  n + i }
    end
  end

  [1,3,5,7,9].sum
  (1..100).sum

inject - стандартный метод в Ruby 1.7.