一谈到闭包 (Proc
), Rubyist 的脑袋里往往会浮现出 blocks, Proc, lambda 之类概念。
此时,你心中可能开始嘀咕: why ? 这概念是不是太多了, Ruby 的闭包怎么这么复杂啊。
其实不然,Ruby 的闭包并没想象的那么复杂,我们需要通过现象看本质,揭开它的神秘面纱。
一、了解 ruby 闭包创建方式
1. blocks
2. proc
3. Proc.new
4. lambda
5. ->
6. method to to_proc
好了,以上就是在 Ruby 中创建闭包的不同方式,通过运行结果你不难发现:
- 所有方式返回结果都是 Proc 的对象(实例)。
- Proc 对象有两种: lambda 和非 lambda。 我们可以通过
lambda?
方法来检查。
二、不同方法特别说明
blocks
是我们平时写的最多的,主要配合yield
使用,这种方式有个问题是没法共用 block 。Proc.new
就是对象实例方法。proc
和lambda
是 RubyKernel
模块提供的方法,用于生成一般 proc 和 lambda proc 。->
是 Ruby 操作符,用于生成 lambda proc 。to_proc
是 RubyMethod
对象的实例方法, 用于将已有 method 转变成 lambda proc 。
三、 一般 proc 和 lambda proc 区别
- lambda 会对参数个数验证,proc 不会验证。
- lambda 会执行 return, proc 遇到 return 会中断。
总结: 无论 proc 还是 lambda,其实本质都是一个东西,因为我们最终用到的都是 Proc 的对象,所以闭包就是 Proc 对象。