В Ruby фигурные скобки могут обозначать блок кода или литерал Hash. Внутри интерполируемой строки конструкция #{...} вычисляет выражение. Блок {...} не равен хешу: смысл определяется синтаксическим контекстом. У блочной записи {...} приоритет выше, чем у do...end, поэтому механическая замена может изменить привязку блока к методу.
Что означают фигурные скобки в Ruby?
Фигурные скобки как блок, литерал Hash и часть интерполяции. Почему контекст важнее самого символа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Основные значения {} определяются контекстом.
Блок, передаваемый методу:
numbers = [1, 2, 3].map { |n| n * 2 }
p numbers # [2, 4, 6]
|n| задаёт параметр блока, а последнее выражение возвращает значение текущего вызова. Для блока также возможна запись do ... end. Обычно фигурные скобки используют для компактных блоков, но язык не запрещает многострочное содержимое.
Литерал хеша:
user = { name: "Anna", age: 30 }
settings = { "theme" => "dark", notifications: true }
empty = {}
Здесь создаются пары ключей и значений, а не выполняемый блок. Хеши можно вкладывать в массивы и наоборот: [{ id: 1 }, { id: 2 }].
Интерполяция:
name = "Anna"
puts "Hello, #{name.upcase}!"
В строке с двойными кавычками #{...} вычисляет выражение и вставляет результат. Это отдельная конструкция; у обычной строки в одинарных кавычках такой интерполяции нет. Литералы Ruby.
Наконец, {...} и do...end для блоков имеют разный приоритет. В сложном вызове без круглых скобок они могут прикрепиться к разным методам. Если привязка неочевидна, добавьте круглые скобки и не полагайтесь на визуальный отступ. Передача блоков.