Несколько замечаний:
Определение метода, который вызывает только ошибку NotImplemented, несколько избыточно, так как Ruby сделает это в любом случае, если метод не существует. Код, который вы там написали, так же полезен, как и просто добавление комментария, говорящего: «Вы должны реализовать метод с именем compare_to». Фактически это то, что делает модуль Enumerable в стандартной библиотеке Ruby - в документации конкретно говорится, что для использования функциональности в Enumerable необходимо определить метод each ().
метод compare_to также является избыточным, поскольку именно для этого предназначен оператор <=>.
Использование реального объекта итератора в Ruby немного излишне, поскольку блоки имеют более элегантный и простой подход. То же самое относится и к шаблону посетителя - вам не нужно использовать посетителя для «расширяемых и повторно используемых операций обхода», когда вы можете просто передать блок методу обхода. Например, у вас есть много из них в Enumerable: each, each_with_index, map, inject, select, delete_if, partition и т. Д. Все они по-разному используют блок для обеспечения другого типа функциональности, и могут быть добавлены другие функциональные возможности. довольно простым и последовательным способом (особенно если у вас есть открытые классы).
Что касается интерфейсов, в Ruby (и почти любом другом динамическом языке, например, Python) люди обычно используют интерфейсы, неявные , что означает, что вы фактически не определяете интерфейс в коде , Вместо этого вы обычно полагаетесь на документацию и надлежащие тестовые наборы, чтобы гарантировать, что код хорошо работает вместе.
Я думаю, что ваш код может быть более согласованным с кем-то из мира Java, потому что он придерживается "Java-способа" ведения дел. Однако другим программистам на Ruby ваш код может показаться запутанным и трудным для работы, так как он на самом деле не придерживается "Ruby-способа" ведения дел. Например, реализация функции выбора с использованием объекта итератора:
it = my_list.iter
results = []
while it.has_next?
obj = it.next
results << obj if some_condition?
end
гораздо менее понятен программисту на Ruby, чем:
results = my_list.select do |obj|
some_condition?
end
Если вы хотите увидеть пример библиотеки структур данных в Ruby, вы можете увидеть гем алгоритмов здесь: http://rubydoc.info/gems/algorithms/0.3.0/frames
Также взгляните на то, что предусмотрено по умолчанию в модуле Enumerable: http://www.ruby -doc.org / core / classes / Enumerable.html . Когда вы включаете Enumerable, вы получаете все эти функции бесплатно.
Надеюсь, это поможет!