Я попытался взглянуть на реализацию yield , чтобы увидеть, сможем ли мы воспроизвести его поведение, но я думаю, что это ключевое слово, поэтому нет способа посмотреть на реализацию.
Я попытался с block_given, и, глядя на реализацию из ruby core rdocs , я обнаружил, что block_given? реализован так:
rb_f_block_given_p()
{
if (ruby_frame->prev && ruby_frame->prev->iter == ITER_CUR && ruby_block)
return Qtrue;
return Qfalse;
}
Как видите, это C, так что это слишком низкоуровневая реализация. Мы не можем сделать то же самое.
Если block_given? методы должны полагаться на реализацию C, чтобы просто проверить, что блок передан, я не вижу, как мы можем получить этот блок и вызвать его в коде ruby.
Так что я думаю, что нет способа делать то, что вы хотите.