Ответ 1
Есть несколько вещей, чтобы понять:
-
всякий раз, когда хэш является первым аргументом вызываемого метода, вам нужно использовать скобки или удалять фигурные скобки, иначе рубин думает, что это блок. Поэтому
puts { foo: "bar" }
вызывает синтаксическую ошибку, ноputs foo: "bar"
,puts(foo: "bar")
илиputs({foo: "bar"})
работают нормально. -
каждый метод может быть вызван блоком, однако только некоторые методы фактически вызывают блок. Вы можете проверить его сами -
puts(1) { raise }
просто выводит номер и не вызывает ошибку.puts { 1 }
ничего не печатает, потому что блок не вызывается. -
Метод
puts
всегда возвращает nil. Поэтому, когда вы говоритеputs {}.class
, это в основном то же самое, чтоputs.class
, которое является NilClass