これは有効な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