Что обозначают квадратные скобки при работе с Hash в Ruby?

Чтение через [] и запись через []=, значения по умолчанию и отличие fetch от обычного обращения по ключу.

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

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

hash[key] вызывает метод [] и читает значение по ключу; hash[key] = value вызывает другой метод — []= — и добавляет либо обновляет пару. Это не один метод для обеих операций. Если ключа нет, [] возвращает default или результат default_proc, обычно nil; fetch позволяет явно обработать отсутствие.

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

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

Синтаксис с квадратными скобками скрывает обычные вызовы методов. Для чтения и присваивания у Hash предусмотрены разные методы:

settings = { theme: "light" }

p settings[:theme]          # "light": метод []
settings[:theme] = "dark"   # метод []=
settings[:language] = "ru"  # добавление нового ключа

p settings[:theme]          # "dark"

Эквивалентные явные формы — settings.[](:theme) и settings.[]=(:theme, "dark"). Обычно используют привычную короткую запись. Присваивание существующему ключу заменяет значение, а новому — создаёт пару.

Если ключ отсутствует, [] использует значение по умолчанию или default_proc. У обычного {} результатом будет nil, но это не универсальное правило для всех Hash:

counts = Hash.new(0)
p counts[:missing]      # 0
p counts.key?(:missing) # false: само чтение не добавило ключ

Когда нужен контроль отсутствующего ключа, удобнее fetch: без запасного значения он выбросит KeyError, а fetch(:key, fallback) вернёт запасной вариант. key? позволяет отдельно отличить отсутствующую пару от явно сохранённого nil.

Не путайте hash[key] с литералом { key: value }: первая запись обращается к существующему объекту, вторая создаёт хеш. Hash#[], Hash#[]=.

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

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

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

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