Ruby: убрать блок из блока?

Возможно ли для lambda, proc, method или другого типа блока в ruby, чтобы уступить другому блоку?
что-то вроде...

a = lambda {
  puts 'in a'
  yield if block_given?
}

a.call { puts "in a block" }

это не работает... он просто создает

in a
=> nil

Есть ли способ получить блок для вызова блока?

Ответ 1

Я не уверен, что вы можете это сделать, но что-то подобное:

В Ruby 1.8.6:

a = lambda { |my_proc|
  puts 'in a'
  my_proc.call
}

a.call(lambda { puts "in a block" })

В Ruby 1.9.1 вы можете иметь параметры блока

a = lambda { |&block|
  puts 'in a'
  block.call
}

a.call { puts "in a block" }

Ответ 2

Вы можете вызвать блок, похожий на yielding.

a = lambda {|&block| block.call if block}
a.call {print "hello"}

Обратите внимание, что

a.call

Не будет возвращена ошибка.