24、Ruby 中的 Lambda、闭包、方法对象与函数式编程

Ruby 中的 Lambda、闭包、方法对象与函数式编程

1. Lambda 与变量访问问题

在同一作用域内创建的 Lambda 会共享对变量的访问,这既可能是一个有用的特性,也可能成为错误的源头。当一个方法返回多个闭包时,需要特别关注它们所使用的变量。

例如以下代码:

# Return an array of lambdas that multiply by the arguments
def multipliers(*args)
  x = nil
  args.map {|x| lambda {|y| x*y }}
end
double,triple = multipliers(2,3)
puts double.call(2)    # Prints 6 in Ruby 1.8

在 Ruby 1.8 中,块参数并不总是块局部的,因此所有创建的 Lambda 最终都会共享对 x 的访问, x multipliers 方法的局部变量。闭包捕获的是变量本身,而不是变量的当前值。所以这里创建的每个 Lambda 都共享变量 x ,该变量只有一个值,所有返回的 Lambda 都使用这个相同的值,这就是为什么名为 double 的 Lambda 最终将其参数乘以 3 而不是 2 的原因。

不过在 Ruby 1.9 中,这个问题就不存在了,因为在该版本的语言中,块参数始终是块局部的。但在循环中创建 Lambda 并在 La

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值