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
超级会员免费看
订阅专栏 解锁全文
12

被折叠的 条评论
为什么被折叠?



