Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45170
  • 博文数量: 43
  • 博客积分: 1161
  • 博客等级: 少尉
  • 技术积分: 425
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-24 11:14
文章分类
文章存档

2011年(40)

2010年(3)

分类: Python/Ruby

2011-05-14 18:47:47

Closure在数学上的闭包.说真的,返东西的概念我还真不怎么懂,搜了下也是看的我于里雾里的.

来看看书上的原文定义:

The kind of subroutine that can access all lexical variables that existed at the time we declared it is called a closure(a term borrowed fromt he world of mathematics).In Perl terms,a closure is just a subroutine that references a lexical variable that has gone out of scope.

大概来说,Perl里面,闭包其实是一种特殊的子程序.返个子程序引用了一个词法变量,而返个词法变量已经离开其作用域了.

连起来说就是:闭包是一个引用了已经离开其作用域的词法变量的子程序-_-
  1. #!perl
  2. use File::Find;
  3. use strict;
  4. use 5.010;
  5. my $callback;
  6. {#this is a nake code block
  7.     my $count=0;
  8.     $callback=sub {
  9.         print ++$count, ":$File::Find::name\n";
  10.     };
  11. }
  12. find($callback,'.');

返个例子中,nake code block外声明了一个变量$callback,并在nake code block中定义成一个匿名子程序的引用.返个匿名子程序中,使用了一个在返个nake code block中定义的词法变量$count.

在离开nake code block,匿名子程序以回调形式被调用.

  1. 匿名子程序在离开了nake code block后才调用,此时已经离开了词法变量$count的作用域.但是依据perl引用计数的原则,变量名count指向的内存并没有被回收,因为其引用计数迓丌为0,叧有在匿名子程序消失后,才会被系统回.
  2. 词法变量$callback不能在nake code block中声明.如果是在nake code block中申明,那么当程序离开nake code block,也就离开了$callback的作用域,会被系统析构,同时匿名子程序也就消失了,紧跟着$count的引用计数变为0,也被系统回收.
阅读(183) | 评论(0) | 转发(0) |
0

上一篇:Anonymous Subroutines

下一篇:Returning a Subroutine

给主人留下些什么吧!~~