2012-05-20 4 views
0

Каждый раз, когда я вызываю метод проверки на любой модели, я получаю следующее сообщение об ошибке:ошибка проверки - неопределенный метод `zero? '

NoMethodError: undefined method `zero?' for nil:NilClass 

Оказывается, что если я удалю функцию сумму от моего настроенного класса Array, ошибка будет уходить:

class Array 
    def sum 
    inject(nil) { |sum,x| sum ? sum+x : x } 
    end 
.. 

Почему это происходит? Как я могу исправить это и сохранить функцию sum?

ответ

1

Rails уже обеспечивает sum функции для массивов (на самом деле на Enumerable модуль, так что он может быть использован в других коллекциях)

Он отличается от вашей функции в двух отношениях:

  • [].sum возвращает 0 по умолчанию, а не ноль
  • он принимает блок, т.е. [1,2,3].sum {|x| x * 2} возвращает 12.

Трудно сказать без обратной линии, но, по-видимому, какой-то код в рельсах опирается на первое из этих двух действий. Удалите определение функции sum, и все должно быть в порядке. Если вам нужна сумма пустого списка nil метод суммирования rails принимает в качестве необязательного аргумента, что возвращать для пустого списка

+0

Я реализовал его из-за этой функциональности (взвешенный случайный массив): http: // dzone. com/snippets/weighted-random-array – Aljaz

+1

Вам не нужно определять сумму, потому что рельсы определяют ее для вас. Предположительно автор кода, с которым вы связались, не хотел предполагать наличие рельсов (или он превышает сумму рельсов) –

Смежные вопросы