
一谈到闭包 (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 对象。