Ruby 中创建 Proc
的方式有两种,很简单的,如下
Proc.new {}.inspect # #<Proc:0x007f9ab7990440@-e:1>
还有使用 Lambda 的方式创建 Proc
-> {}.inspect # #<Proc:0x007fa71d0a86a8@-e:1 (lambda)>
严格的参数处理
lambda 表达式对参数的使用非常严格。在调用 call()
方法时如果传递了错误的参数数量,那么就会抛出一个异常 ArgumentError
irb> ->(arg1, arg2) {}.call(1) wrong number of arguments (given 1, expected 2) ArgumentError irb> ->(arg1, arg2) {}.call(1,2,3) wrong number of arguments (given 3, expected 2) ArgumentError
但是呢,Proc
对参数的处理却非常的灵活
irb> Proc.new {|arg1, arg2| puts "args: #{arg1}, #{arg2}"}.call(1) => args: 1, irb> Proc.new do |arg1, arg2| puts "args: #{arg1}, #{arg2}" end.call(1,2,3) => args: 1, 2
返回值和不返回值
在 lambda 表达式内部可以使用 return
来回到调用表达式的作用域,例如下面的代码
def lambda_return puts "Before lambda call." lambda {return}.call puts "After lambda call." end irb> lambda_return Before lambda call. After lambda call.
另一方面,在 Proc 中使用 return 将跳出 proc 的调用作用域
def proc_return puts "Before proc call." Proc.new {return}.call puts "After proc call." end irb> proc_return Before proc call.
上面的代码中,Proc.new {return}.call
会跳出调用 proc
的作用域,也就是跳出 proc_return
方法,因此 puts "After proc call."
并不会的得到执行
目前尚无回复