💎 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
对象有一些显著的不同:
- 创建方式:
lambda
需要明确的创建过程,而Proc
对象可以通过Proc.new()
直接创建,或通过语句块间接转换。换句话说,所有隐式转换得到的Proc
对象都是普通的Proc
对象,而不会是lambda
。因此,方法调用时,&blk
的blk
不能是一个lambda
。
- 返回行为:
- 在
lambda
中,return
语句只会返回lambda
自身,而在Proc
对象中,return
语句会返回调用语句块所在的方法。
- 在
- 参数处理:
lambda
严格要求声明的参数数量与调用时的参数数量一致;而Proc
对象则较为宽松。
示例:返回行为
以下示例展示了 lambda
和 Proc
的返回行为不同:
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
进行授权