Неожиданное поведение в Ruby для "puts {}.class"

puts {}.class

#=> NilClass 

puts "".class
String
#=> nil 

puts [].class
Array
#=> nil

Почему puts {}.class не показывает Hash как вывод, а затем nil, как и остальные?

Ответы

Ответ 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

Ответ 2

puts {} интерпретируется как вызов метода puts с пустым блоком, переданным в него, следовательно, пустой результат. puts({}.class) работает так, как вы ожидаете.