Как найти "существенные" методы для обеспечения интерфейса Ruby-миксинов?
Ужасность названия вопроса - вот что я пытаюсь решить. Пример:
в Ruby Enumerable является интерфейсом в том смысле, что я могу что-то реализовать и задокументировать это как:
def myfancymethod(please_pass_me_an_Enumerable_here)
но с другой стороны, Enumerable является своего рода усилением интерфейса, в котором в качестве одного из методов используется #each. Если у меня есть класс
class Foo
def each
:bar
end
end
Для тех, кто не знаком с Ruby, если вы смешаете модуль Enumerable в классе, вы получите десятки методов, которые полагаются только на #each
метод, чтобы обеспечить такие вещи, как #map
, #select
, так далее.
Я мог бы сказать, что мой Foo
класс Enumerable-способен или Enumerable-совместим или как? Какие термины описывают ответ на вопрос "Что нужно, чтобы быть перечислимым?", "Ну, у вас должен быть #each"
Точно так же в Ruby
(Array.new.methods - Object.new.methods).size # 111
Значит ли это, что для фальсификации интерфейса Array мне нужно реализовать 111 методов? Нет, но как узнать, какие методы являются "сущностью" массива. это просто #[]
, #[]=
а также #size
? Как понять это?
2 ответа
Вас может заинтересовать этот запрос, который предлагает некоторые улучшения в архитектуре широко используемых Hash
учебный класс.
Грустная правда - забыть об этом. На данный момент Ruby не имеет ничего подобного. Enumerable
а также Comparable
они настолько близки, насколько это возможно, и их "контракт" является лишь вопросом документации.
Кстати, я верю #size
это другой метод, который Enumerable
Можно использовать, хотя это необязательно.
Я думаю о слове "контракт". Контракт Enumerable, например, "дай мне #each
и я дам тебе эти причудливые методы ".