什么是闭包?

‘闭包’(Closure)是一类函数的名称,这些函数能够在创建块的作用域(将其视为块的“原作用域”,native scope)内存储(即“封闭”,enclose)局部变量的值。Ruby 的块是闭包。要理解这一点,请看这个示例:

  1. x = "hello world"
  2. ablock = Proc.new { puts( x ) }
  3. def aMethod( aBlockArg )
  4. x = "goodbye"
  5. aBlockArg.call
  6. end
  7. puts( x )
  8. ablock.call
  9. aMethod( ablock )
  10. ablock.call
  11. puts( x )

这里,在 ablock 作用域的内局部变量 x 的值是 “hello world”。但是,在 aMethod 方法中,名为 x 的局部变量具有值,’goodbye’。尽管如此,当 ablock 被传递给 aMethod 并在 aMethod 的作用域内调用时,它打印出 “hello world”(即,在块的 ‘native scope’ 中 x 的值,而不是在 aMethod 的作用域内 x 的值 ‘goodbye’)。

有关闭包(closures)的更多信息,请参阅本章末尾的“深入探索”