deffoo1yieldenddeffoo2(&b)b.callifbendfoo1{puts"foo1 in block"}foo2{puts"foo2 in block"}proc=Proc.new{puts"foo in proc"}foo1(&proc)foo2(&proc)lambda_proc=lambda{puts"foo in lambda"}foo1(&lambda_proc)foo2(&lambda_proc)
输出:
123456
》foo1 in block
》foo2 in block
》foo in proc
》foo in proc
》foo in lambda
》foo in lambda
这大概是最让人困惑的地方,从 Example 1 的行为上看,他们的效果是一致的,为什么要用两种不同的表达方式。
12
proc=Proc.new{puts"foo in proc"}lambda_proc=lambda{puts"foo in lambda"}
确实,对于简单的情况,比如 Example 1的情况,他们的行为是一致的,但是主要在两个地方有明显差异:
1.1 参数检查
还是例子说话
Example 3:
12345678910111213
deffoox=100yieldxendproc=Proc.new{|a,b|puts"a is #{a.inspect} b is #{b.inspect}"}foo(&proc)lambda_proc1=lambda{|a|puts"a is #{a.inspect}"}foo(&lambda_proc1)lambda_proc2=lambda{|a,b|puts"a is #{a.inspect} b is #{b.inspect}"}foo(&lambda_proc2)
输出
1234
》a is 100 b is nil
》a is 100
》ArgumentError: wrong number of arguments (1 for 2) …
deffoof=Proc.new{return"return from foo from inside proc"}f.call# control leaves foo herereturn"return from foo"enddefbarf=lambda{return"return from lambda"}putsf.call# control does not leave bar herereturn"return from bar"endputsfooputsbar
输出
123
》return from foo from inside proc
》return from lambda
》return from bar