Proc 与 Lambda
Proc.new/lambda/->、参数检查差异、& 转换、闭包
Proc 与 Lambda
Block 不是对象——不能存变量。Proc 和 Lambda 是可保存、可传递的块对象。
学完本章你将: 掌握 Proc.new/lambda/->、参数检查差异、& 转换。
Proc —— 把块变成对象
ruby
# 创建
p = Proc.new { |name| puts "Hello, #{name}!" }
p = proc { |name| puts "Hello, #{name}!" }
p.call("Ruby") # Hello, Ruby!
# 作为参数
def execute(operation)
operation.call(5, 3)
end
add = proc { |a, b| a + b }
puts execute(add) # 8
Lambda —— 更严格的 Proc
ruby
# 创建
l = lambda { |name| puts "Hello, #{name}!" }
l = ->(name) { puts "Hello, #{name}!" } # 简洁语法
# Lambda vs Proc——参数检查
p = proc { |a, b| [a, b] }
l = ->(a, b) { [a, b] }
p.call(1) # [1, nil]——少参数填 nil
l.call(1) # ArgumentError——必须 2 个参数
# return 行为不同
def test_proc
p = proc { return "从 proc 返回" }
p.call
"不会执行到这"
end
def test_lambda
l = -> { return "从 lambda 返回" }
l.call
"会执行到这" # lambda 的 return 只从自身返回
end
| Proc | Lambda | |
|---|---|---|
| 参数检查 | 宽松 | 严格 |
| return | 从外层方法返回 | 只从自身返回 |
| 创建 | proc/Proc.new | lambda / -> |