→ Playing with blocks in Ruby, passing blocks, calling blocks → → →

Below is some code that plays with blocks. It shows different methods of passing a block, passing parameter and block, as well as passing variable number of parameters and block. It also shows two different ways of calling a block(using .call and []). Can you predict output of the script?

class BlockShow

  def a(par, &block)
    puts "in method a"
    puts "method called with: #{par}"
    x = block.call 'param for block'
    puts "again in method, handling: #{x}"
    b(block)
    c(&block)
    d('1st', '2nd', &block)
    d(&block)
  end

  def b(block)
    puts "in method b that expects block as param"
    block.call 'param for block from b'
  end

  def c(&block)
    puts "in method c that expects block as block"
    block['param for block from c']
  end

  def d(*params, &block)
    puts "in method d that expects parameters and block"
    puts "called with #{params.size} parameters"
    block.call params.join("+")
  end

end

BlockShow.new.a('param for object') do |par|
  puts "in block"
  puts "block called with: #{par}"
  "result of block called with #{par}"
end

Expected output can be seen below:

in method a
method called with: param for object
in block
block called with: param for block
again in method, handling: result of block called with param for block
in method b that expects block as param
in block
block called with: param for block from b
in method c that expects block as block
in block
block called with: param for block from c
in method d that expects parameters and block
called with 2 parameters
in block
block called with: 1st+2nd
in method d that expects parameters and block
called with 0 parameters
in block
block called with:

Created on 12 May 2009