perl闭包

看了《perl语言编程》里闭包那节,结合自己例子及参考网上,把自己的理解整理出来,有理解错误地方,请指正。

我喜欢看代码方式,来理解作者为什么想出closure(闭包)这个词。

closure.pl

#!/usr/bin/perl
USE warnings;
#use strict;
 
my $out="i out";
{
  my $count=10;
  my $out="you out";
  $f_ref=sub {RETURN $out;};  --this is closure
  $s_ref=sub {RETURN ++$count;} --this is closure
};
print "which \$out is used!\n";
print "$out\n";
print &{$f_ref}."\n";
print "the \$count is changed?\n";
print "$count\n";
print &{$s_ref}."\n";
[root@xxx luoxuan]# perl closure.pl 
1、Name "main::count" used only once: possible typo at closure.pl line 16.
2、which $out is used!
3、i out
4、you out
5、the $count is changed?
6、Use of uninitialized value $count in concatenation (.) or string at closure.pl line 16.
7、11

为了方便说时,在每行输出的地方,加了个行号

1、$count定义在匿名block内,print “$count\n”是访问不到,所以报错
2、print “which \$out is used!\n”;
3、打印了匿名block外的$out的值
4、打印了匿名block内的$out的值
5、print “the \$count is changed?\n”;
6、匿名block内的$count是访问不到的
7、匿名block内的$count加1后返回

我的理解:
1、闭包可以访问闭包本身作用域范围之外的变量
2、当匿名block内没有定义和匿名block外变量名相同的变量,闭包访问是匿名block外变量的值

看着闭包,让我想到OOP:
当定义类的时候,会定义各个方法及属性,当创建对象后,我们可以通过各个方法(闭包),来访问对象中的属性。

参考:http://www.perlmonks.org/?node_id=138195


Post a Comment