确定参数/变量是否为(“is_a?”)lambda?

时间:2012-03-28 00:27:38

标签: ruby lambda

如何检查给定参数是否为lambda?

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)

2 个答案:

答案 0 :(得分:37)

一个块不是一个lambda。要查看是否有阻止使用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

快乐的编码。

答案 1 :(得分:0)

实际上,您可以检查变量is_a?是否为Proc

x = (lambda {})
x.is_a?(Proc) # true