Ruby 中的 Proc 和 Lambda 表达式

yufei       6 年, 3 月 前       1317

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." 并不会的得到执行

目前尚无回复
简单教程 = 简单教程,简单编程
简单教程 是一个关于技术和学习的地方
现在注册
已注册用户请 登入
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.