Это правильный синтаксис Ruby. Ну вроде. Это просто не имеет смысла!
Поскольку приоритет буквенного блока с использованием фигурных скобок выше, чем передача аргумента без скобок, блок связывается с аргументом вместо вызова метода. Если аргумент сам вызов метода, вы даже не получите синтаксическую ошибку. Вы просто почесаете голову, задаваясь вопросом, почему ваш блок не вызывается.
Чтобы исправить это, вы должны поместить круглые скобки вокруг аргумента, поскольку скобки имеют более высокий приоритет, чем фигурные скобки, или использовать форму do
/ end
, которая имеет меньший приоритет, чем список аргументов без скобок.
def foo; yield if block_given?; 'foo' end
puts foo { puts 'block' }
# block
# foo
puts(foo) { puts 'block' }
# foo
puts foo do puts 'block' end
# foo
puts foo { puts 'block' }, foo { puts 'block' }
# block
# block
# foo
# foo
puts 'foo' { puts 'block' }
# SyntaxError: (irb):19: syntax error, unexpected '{', expecting $end