Нужно добавить модуль, который добавляет объекту массив. Данный код почему-то не работает, доступа в методах к массиву @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 без аргументов и скобок прокидывает аргументы текущего вызова).
Комментариев нет:
Отправить комментарий