Я часто суммирую массивы в своем коде, поэтому я думаю о том, чтобы обезьяна исправить класс Array, чтобы включить метод суммы (который суммирует все элементы в массиве):
class Array
def sum
self.inject{ |s, t| s + t }
end
end
Однако я никогда раньше ничего не исправлял в общем коде и сомневаюсь, что это «безопасный» способ (например, может быть, кто-то уже определил sum
метод в Array
).
Итак, как лучше всего иметь возможность суммировать массивы в коде, который я пишу, без необходимости писать arr.inject{ |s, t| s + t }
каждый раз? Есть ли безопасный способ обезьяньего патча? Могу я как-нибудь использовать модуль? Или мне просто написать где-нибудь вспомогательный метод, который принимает массив и возвращает сумму (т.е. def sum_array(arr); return arr.inject{ |s, t| s + t }; end
)? (Или есть какой-то совершенно другой подход?)
Enumerable#sum
, а не толькоArray#sum
), но, конечно, любой обезьяний-патч небезопасен. Без чего-то вроде remix, несомненно, самым безопасным вариантом будет вспомогательный метод. - person Phrogz   schedule 23.07.2011self
- это получатель по умолчанию в Ruby, поэтому вы можете не использовать его. Ваш блок эквивалентен&:+
, поэтому вы можете также написать метод какinject(&:+)
.inject
даже принимает аргумент символа и выполняет преобразование блока за вас, так что вы также можете избавиться от&
. Также обратите внимание, что вы на самом деле не зависите от того факта, чтоself
являетсяArray
, только то, что у него есть методinject
, поэтому вы можете поднять его доEnumerable
и получитьmodule Enumerable; def sum; reduce(:+) end end
. - person Jörg W Mittag   schedule 23.07.2011sum
вArray
- действительно, он есть в _ 3_. Какой BTW более гибкий, чем ваш, и лучше справляется с угловым случаем пустой коллекции. - person Jörg W Mittag   schedule 23.07.2011