Search code examples
rubypuzzle

why doesn't this code do what I expect


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?


Solution

  • 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" }