Безопасное добавление метода `sum` в класс Array - PullRequest
4 голосов
/ 23 июля 2011

Я делаю много суммирования массива в своем коде, поэтому я думаю о том, чтобы поменять класс Array, чтобы включить метод sum (который суммирует все элементы в массиве):

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)? (Или есть какой-то совершенно другой подход?)

Ответы [ 2 ]

5 голосов
/ 23 июля 2011

inject на самом деле может принимать символьный аргумент, поэтому все, что вам действительно нужно написать, это arr.inject(:+), что, я думаю, на самом деле не нуждается в более короткой форме.

http://www.ruby -doc.org / ядро ​​/ классов / Enumerable.html # M001494

3 голосов
/ 23 июля 2011

Вы всегда можете создать подкласс массива и определить его там. Скажем, если бы у вас было AdderArray < Array, вы могли бы найти такую ​​сумму:

AdderArray.new(a1).sum

Или вы можете просто определить вспомогательную библиотеку:

ArrayHelper.sum(a1)

Это действительно зависит от вас, что делать. Я даже не вижу проблемы с исправлением обезьян (каков шанс, что кто-то собирается создать метод массива с именем sum, который не суммируется?). Даже если конфликт все-таки случится, вы всегда можете переименовать его в sum_members по факту.

...