Объекты можно передать отдельными позиционными или именованными аргументами, собрать в Array либо Hash, принять переменное число через *args. Общий прикладной предок не требуется. Метод должен явно определять, что он делает с каждым аргументом и какие операции от него ожидает.
Как передать не связанные между собой объекты в метод Ruby?
Отдельные аргументы, именованные параметры и коллекции позволяют передавать разные объекты. Выбор зависит от контракта метода, а не общей иерархии классов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
В Ruby аргументы метода могут быть объектами разных классов. Между ними не требуется специальной связи или общего прикладного предка. Важен контракт: для чего нужен каждый аргумент и какие операции выполняет метод.
Для небольшого фиксированного набора подходят отдельные аргументы. Именованные параметры делают назначение очевиднее:
def describe(name:, count:)
"#{name}: #{count}"
end
puts describe(name: 'Задачи', count: 3)
Строка и число передаются независимо. Метод не объединяет их в один тип.
Если объектов произвольное количество и все обрабатываются одинаково, используют массив или *args:
def inspect_objects(*objects)
objects.map(&:inspect)
end
p inspect_objects('text', 42, Object.new)
Массив подходит, когда важны порядок и перебор. Хеш удобен для именованных ролей, например { logger: logger, cache: cache }. Но скрывать десятки несвязанных зависимостей в одном хеше обычно хуже, чем пересмотреть обязанности метода.
В динамическом коде часто важен поддерживаемый интерфейс, а не точный класс: если метод вызывает write, аргумент должен уметь выполнять подходящий write. Это не отменяет проверки входных данных на границе приложения.