Как найти необходимые методы для обеспечения интерфейса примесей 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-совместимым или что? Какие термины описывают ответы на вопросы «Что нужно, чтобы быть Enumerable?», «Ну, у вас должен быть #each»

Точно так же в Руби

(Array.new.methods - Object.new.methods).size # 111

Означает ли это, что для имитации интерфейса Array мне нужно реализовать 111 методов? Ни в коем случае, но как узнать, какие методы являются «сущностью» массива. это просто #[], #[]= и #size? Как это понять?


person ulver    schedule 24.05.2012    source источник
comment
Ваш вопрос о термине? Или о том, как найти необходимые методы?   -  person Sergio Tulentsev    schedule 25.05.2012
comment
Я думаю, что было бы намного проще ответить на языке с интерфейсами.   -  person Russell    schedule 25.05.2012
comment
@SergioTulentsev последнее было бы потрясающе. Я до сих пор не знаю, какие основные методы ActiveRecord или Array.   -  person ulver    schedule 25.05.2012
comment
Что означает подделка интерфейса массива на языке утиного ввода?   -  person Mladen Jablanović    schedule 25.05.2012


Ответы (2)


Вас может заинтересовать этот запрос на функцию, в котором предлагаются некоторые улучшения в архитектуре широко используется Hash класс.

Печальная правда заключается в том, что забудьте об этом. На данный момент у Ruby нет ничего подобного. Enumerable и Comparable настолько близки, насколько это возможно, и их «контракт» — это просто вопрос документации.

Кстати, я считаю, что #size — это еще один метод, который может использовать Enumerable, хотя это и необязательно.

person trans    schedule 28.05.2012

Я думаю о слове "договор". Контракт Enumerable, например, таков: «дайте мне #each, и я дам вам эти причудливые методы».

person Sergio Tulentsev    schedule 24.05.2012
comment
Есть ли где-нибудь каталог общих/существующих контрактов? Я никогда не видел ничего подобного в мире Ruby. Теперь я вижу, что в Java это отслеживание не нужно, потому что вы просто публикуете класс, используемый как новый Enumerable (каждый источник), или выполняете наследование. - person ulver; 25.05.2012
comment
Кроме того, дизайн по контракту великолепен, но он включает в себя всю науку о предварительных/последующих условиях/инвариантах и ​​т. д. Меня просто интересуют наборы основных интерфейсов. - person ulver; 25.05.2012