Метод next
для Date
определен в классе Date
, и методы, определенные в классе, имеют приоритет над методами, определенными во включенном модуле.Итак, когда вы делаете это:
class Date
include DateExtension
end
Вы загружаете свою версию next
, но next
, определенный в Date
, по-прежнему имеет приоритет.Вам нужно будет указать next
прямо в Date
:
class Date
def next(symb=:day)
dt = DateTime.now
{:day => Date.new(dt.year, dt.month, dt.day + 1),
:week => Date.new(dt.year, dt.month, dt.day + 7),
:month => Date.new(dt.year, dt.month + 1, dt.day),
:year => Date.new(dt.year + 1, dt.month, dt.day)}[symb]
end
end
Из главы Ruby по программированию о Классы и объекты :
Когда класс включает модуль, методы экземпляра этого модуля становятся доступными как методы экземпляра класса.Это почти как если бы модуль стал суперклассом класса, который его использует.Не удивительно, что это о том, как это работает.Когда вы включаете модуль, Ruby создает анонимный прокси-класс, который ссылается на этот модуль, и вставляет этот прокси в качестве прямого суперкласса класса, который сделал включение.