Z
ZHANK
方法与块

Proc 与 Lambda

Proc.new/lambda/->、参数检查差异、& 转换、闭包

Proc 与 Lambda

Block 不是对象——不能存变量。ProcLambda 是可保存、可传递的块对象。

学完本章你将: 掌握 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
ProcLambda
参数检查宽松严格
return从外层方法返回只从自身返回
创建proc/Proc.newlambda / ->