I'd expect this code:
def print_call_and_return(string, &block)
puts string
block.call unless !block
"return"
end
puts print_call_and_return("parameter") do
puts "block"
end
to print:
parameter
block
return
however it actually prints the following:
irb(main):011:0> puts print_call_and_return("parameter") do
irb(main):012:1* puts "block"
irb(main):013:1> end
parameter
return
=> nil
could someone explain this?
This does work:
puts print_call_and_return("parameter") { puts "block" }
I think the reason has to do with operator precedence. do/end
has higher precedence than {}
blocks.
puts print_call_and_return("parameter") do
puts "block"
end
is the same as
puts(print_call_and_return("parameter")){ puts "block" }