Как передать не связанные между собой объекты в метод Ruby?

Отдельные аргументы, именованные параметры и коллекции позволяют передавать разные объекты. Выбор зависит от контракта метода, а не общей иерархии классов.

Короткий ответ

Что ответить на собеседовании

Объекты можно передать отдельными позиционными или именованными аргументами, собрать в Array либо Hash, принять переменное число через *args. Общий прикладной предок не требуется. Метод должен явно определять, что он делает с каждым аргументом и какие операции от него ожидает.

Подробный разбор

Ответ с пояснениями

В 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. Это не отменяет проверки входных данных на границе приложения.

Позиционные, именованные и переменные аргументы Ruby

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку