Rendimento em um bloco anônimo

Não estou entendendo o seguinte comportamento (veja também neste tópico SO):

def def_test
  puts 'def_test.in'
  yield if block_given?
  puts 'def_test.out'
end

def_test do
  puts 'def_test ok'
end

block_test = proc do |&block|
  puts 'block_test.in'
  block.call if block
  puts 'block_test.out'
end

block_test.call do
  puts 'block_test'
end

proc_test = proc do
  puts 'proc_test.in'
  yield if block_given?
  puts 'proc_test.out'
end

proc_test.call do
  puts 'proc_test ok'
end

Resultado

def_test.in
def_test ok
def_test.out
block_test.in
block_test ok
block_test.out
proc_test.in
proc_test.out

Não me importo de declarar explicitamente a variável & block e chamá-la diretamente, mas o ideal é que eu queira entenderporqu Acabo precisando.

questionAnswers(2)

yourAnswerToTheQuestion