Ceder en un bloque anónimo

No entiendo el siguiente comportamiento (ver tambiénen este hilo 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

Salida

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

No me importa recurrir a declarar explícitamente la variable & block y llamarla directamente, pero lo ideal sería que tuviera sentido depor qu Termino necesitando.