+ -
当前位置:首页 → 问答吧 → 如何在构造函数里使用闭包

如何在构造函数里使用闭包

时间:2011-01-24

来源:互联网

有些同学很没搞明白闭包与OO的概念,我随手写个例子演示下:
  1. package A;
  2. use strict;

  3. sub new {
  4.     my $class = shift;
  5.     my %hash;
  6.     bless sub {
  7.         my ($k,$v)=@_;
  8.         $hash{$k} = $v if defined $k;
  9.         \%hash;
  10.     },$class;
  11. }

  12. 1;

  13. package B;
  14. use Data::Dumper;

  15. my $o = A->new();
  16. print Dumper $o->();
  17. print Dumper $o->(1,2);
复制代码
如上,在package A里,new是个构造函数。
在构造函数里,bless了一个匿名子函数(我们可以bless任何目标)。
这个子函数使用了子函数之外声明的my变量(my %hash),该my变量随着匿名子函数一起被输出给外部调用者。
OK这就形成了一个闭包,%hash从new那一刻起,就全局化了。

在package B里,调用A->new创建了一个目标,赋值给$o。
$o目标包含了绑定的匿名子函数,因此可以通过执行$o访问到闭包变量。

于是:


QUOTE:
print Dumper $o->();


不带参数调用,这个一个GET方法。



QUOTE:
print Dumper $o->(1,2);


带参数调用,这个一个SET方法。

只要$o存在,闭包变量%hash就一直存在,对它的值的修改也全局生效。

I hope this helps!

作者: 兰花仙子   发布时间: 2011-01-24

bless 的 CODE 引用,这个少见

作者: zhlong8   发布时间: 2011-01-24

这的确是实现OO封装的一种方法

作者: yiten   发布时间: 2011-01-24