The yield
keyword is behaving no differently from the method invocation syntax. If you have a space between a method name and the parentheses containing the method's arguments, the interpreter parses the parentheses as passing a single argument that is the result of the expression inside of the parentheses.
Take this for example:
def foo
yield('foo', 'bar')
end
foo {|x, y| print x, y }
The above outputs 'foobar' as expected.
def foo
yield ('foo', 'bar')
end
foo {|x, y| print x, y }
Because parentheses for invoking a method are optional and are expected to immediately follow the name (or yield
keyword in this case), here the block is being called with only one argument: the expression ('foo', 'bar')
.
However, a comma is unexpected in this expression and you get the SyntaxError
exception. You can replicate the same error more simply by trying to evaluate the expression ('foo', 'bar')
in irb
.
This is legal:
def foo
yield ('foobar')
end
foo {|x| puts x }
That correctly prints 'foobar' since the result of the expression ('foobar')
is 'foobar'
, and that is the argument passed to the block.
Likewise, this prints 4 and 8 as one would expect:
def foo
yield (2+2), (4+4)
end
foo {|x, y| puts x; puts y }