如何检查给定参数是否为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)
Run Code Online (Sandbox Code Playgroud)
小智 38
块不是 lambda.查看是否有块使用block_given?.
在任何情况下,我会使用"响应呼叫" 当且仅当我真的需要这个构造时,我会尽量避免.(定义合同并让调用者负责正确调用它!)
(lambda {1}).respond_to? :call # => true
(1).respond_to? :call # => false
Run Code Online (Sandbox Code Playgroud)
我相信这种形式的结构(也就是鸭子)打字更像是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
Run Code Online (Sandbox Code Playgroud)
快乐的编码.