Определить, является ли параметр / переменная ("is_a?") Лямбда-выражением? - PullRequest
21 голосов
/ 28 марта 2012

Как проверить, является ли данный параметр лямбда?

def method(parameter)
  if ???
      puts "We got lambda"
      parameter.call
  else
      puts "I did not get a block"
  end
end


method(lambda { 1 })
method(1)

1 Ответ

37 голосов
/ 28 марта 2012

Блок не лямбда. Чтобы увидеть, есть ли блок, используйте block_given?.

В любом случае, я бы использовал «отвечает на вызов» тогда и только тогда, когда мне действительно нужна эта конструкция, которой я бы постарался избежать. (Определите контракт и возьмите на себя звонящего , ответственного за его правильное обращение!)

 (lambda {1}).respond_to? :call # => true
 (1).respond_to? :call          # => false

Я полагаю, что эта форма структурной (иначе говоря, утка) печати более строчная с Ruby, чем именительная печать с отношениями "is a".

Чтобы посмотреть, какие отношения могут быть "есть" (для будущей игры в песочнице):

 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

Удачного кодирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...