Ответ 1
Блок не является лямбдой. Чтобы увидеть, есть ли блок, используйте block_given?
.
В любом случае я бы использовал "отвечает на вызов" тогда и только тогда, когда мне действительно нужна эта конструкция, которую я бы постарался избежать. (Определите контракт и сделайте вызывающего абонента ответственным за его правильное использование!)
(lambda {1}).respond_to? :call # => true
(1).respond_to? :call # => false
Я считаю, что эта форма структурного (ака-утка) типирования больше связана с Ruby, чем именная типизация с "является" отношениями.
Чтобы узнать, что может быть связано с "отношениями" (для будущей игры в песочнице):
RUBY_VERSION # => 1.9.2
(lambda {}).class # => Proc
(Proc.new {}).class # => Proc
def x (&p); p; end # note this "lifts" the block to a Proc
(x {}).class # => Proc
Счастливое кодирование.