Как найти "существенные" методы для обеспечения интерфейса 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 и я дам тебе эти причудливые методы ".

Другие вопросы по тегам