文章

💎 Ruby 匿名方法:Lambda

介绍 Ruby 中的匿名方法 Lambda 及其特性

在 Ruby 中,Kernel 模块中的 lambda 方法或字面符号 -> 可以定义一个特殊的 Proc 对象。以下是一些用法示例:

定义 Lambda

1
2
3
4
5
6
lam = lambda { puts a + b }
lam = -> { puts a + b }

# 指定参数 b 的默认值
lam = lambda { |a, b = 1| puts a + b }
lam = ->(a, b = 1) { puts a + b }

Lambda 与 Proc 的区别

注意,虽然 lambda 不是一个单独的类,但它返回的是一种特殊风格的 Proc 对象。Lambda 与普通的 Proc 对象有一些显著的不同:

  1. 创建方式
    • lambda 需要明确的创建过程,而 Proc 对象可以通过 Proc.new() 直接创建,或通过语句块间接转换。换句话说,所有隐式转换得到的 Proc 对象都是普通的 Proc 对象,而不会是 lambda。因此,方法调用时,&blkblk 不能是一个 lambda
  2. 返回行为
    • lambda 中,return 语句只会返回 lambda 自身,而在 Proc 对象中,return 语句会返回调用语句块所在的方法。
  3. 参数处理
    • lambda 严格要求声明的参数数量与调用时的参数数量一致;而 Proc 对象则较为宽松。

示例:返回行为

以下示例展示了 lambdaProc 的返回行为不同:

1
2
3
4
5
6
7
8
9
10
11
def return_test
  l = lambda { return }
  l.call # 退出 lambda
  puts "Still here!" # 这行会被执行

  p = Proc.new { return }
  p.call # 退出 return_test 方法
  puts "no this message" # 这行不会被执行
end

return_test

结果分析

  • 当调用 l.call 时,return 只会退出 lambda,因此 puts "Still here!" 会被执行。
  • 当调用 p.call 时,return 会直接退出 return_test 方法,因此 puts "no this message" 不会被执行。

总结

lambda 是 Ruby 中一种强大的匿名方法,提供了灵活性和控制力。在需要更严格的参数检查和返回行为时,使用 lambda 是一个不错的选择。

本文由作者按照 CC BY 4.0 进行授权