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

2011年(40)

2010年(3)

分类: Python/Ruby

2011-05-14 18:50:09

更加常见的使用Closure的方式是从一个子程序中迒回一个子程序.既然是返回值,当然也就可以同时返回多个.
  1. #!perl
  2. use File::Find;
  3. use strict;
  4. use 5.010;
  5. sub creat{
  6.     my $total=0;
  7.     return(sub{$total+= -s if -f},sub{return $total});
  8. }
  9. my $subs={};
  10. foreach my $dir(qw(vss vim Perl)) {
  11.     my ($callback,$getter)=creat();
  12.     $subs->{$dir}{CALLBACK}=$callback;
  13.     $subs->{$dir}{GETTER}=$getter;
  14. }
  15. for(keys %$subs){
  16.     find($subs->{$_}{CALLBACK},$_);
  17. }
  18. for(sort keys %$subs){
  19.     my $sum=$subs->{$_}{GETTER}->();
  20.     print "$_ has $sum bytes\n";
  21. }

返个例子中,子程序creat返回了两个匿名子程序,一个用来累加文件大小,一个用来返回文件大小.

之后在一个循环中调用了3creat,分别用来统计文件夹vss,vimPerl.

可以看到,由于在哈希subs中使用了不同的文件夹名作为key,而每个key对应的value即是creat的返回值,也就是匿名子程序的引用.由于key值的不同,使得返3组匿名子程序引用成为各不相同的闭包.程序可以得到正确的结果.
阅读(352) | 评论(0) | 转发(0) |
0

上一篇:Closure

下一篇:高效排序

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