Что является ключом в массиве и хеше Ruby?

Целочисленная позиция Array и произвольный ключ Hash — похожая запись доступа, но разная семантика.

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

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

У Array элемент выбирают по целочисленному индексу: 0 — первый, отрицательные индексы отсчитываются от конца. У Hash ключ — объект, связанный со значением; например, строка, символ или число. Ключ Hash 3 не означает четвёртую позицию. Строка "name" и символ :name — разные ключи.

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

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

Для массива точнее говорить об индексе, а не о ключе словаря. Индекс описывает позицию элемента:

numbers = [10, 20, 30]
p numbers[0]  # 10
p numbers[2]  # 30
p numbers[-1] # 30: отсчёт от конца

У хеша ключ задаётся явно и связан с определённым значением:

values = { "apple" => 1, banana: 2, 3 => "cherry" }
p values["apple"] # 1
p values[:banana] # 2
p values[3]       # "cherry"

Последний пример не читает четвёртый элемент. Он ищет именно ключ 3, независимо от позиции пары при обходе хеша. Сохранение Hash порядка вставки не превращает его в массив с числовыми позициями.

По умолчанию ключи Hash сопоставляются через hash и eql?. Поэтому "banana" и :banana не взаимозаменяемы. У пользовательских объектов-ключей эти методы должны быть согласованы, а влияющее на них состояние желательно не менять после вставки.

Операция [] для отсутствующего индекса массива обычно возвращает nil; для отсутствующего ключа хеша возвращается его значение по умолчанию, первоначально тоже nil. Если отсутствие нужно считать ошибкой, у обеих коллекций есть fetch. Array, Hash.

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

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

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

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