Страницы

Поиск по вопросам

пятница, 1 февраля 2019 г.

Дублирование методов в модулях в Ruby

Нужно добавить модуль, который добавляет объекту массив. Данный код почему-то не работает, доступа в методах к массиву @comments нет
module Library module Commentable attr_accessor :comments def initialize author, title @comments = [] super author, title end end end
class Library::Book include Library::Commentable attr_accessor :author, :title def initialize author, title @author = author @title = title end end


Ответ

Потому что выходит, что сначала вызывается initialize у Library::Book, который унаследованный метод (из Commentable) не вызывает (super там нет).
Library::Book.ancestors #=> [ # Library::Book, <-- он первый по списку # Library::Commentable, # Object, # Kernel, # BasicObject # ]
Если забыть о том факте, что "комментируемое" у вас почему-то принимает аргументы, характерные книге (потому что это деталь задачи, о которой вы ничего не рассказали), возможных выходов два:
(в Ruby 2.0 и новее) Заменить include на prepend, чтобы модуль оказался впереди всей цепочки поиска методов (разве что после метакласса, но это уже дебри). Перенести вызов super в Library::Book (и вспомнить, что вызов super без аргументов и скобок прокидывает аргументы текущего вызова).

Комментариев нет:

Отправить комментарий