hash[key] вызывает метод [] и читает значение по ключу; hash[key] = value вызывает другой метод — []= — и добавляет либо обновляет пару. Это не один метод для обеих операций. Если ключа нет, [] возвращает default или результат default_proc, обычно nil; fetch позволяет явно обработать отсутствие.
Что обозначают квадратные скобки при работе с Hash в Ruby?
Чтение через [] и запись через []=, значения по умолчанию и отличие 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#[]=.