闭包有关的讨论



QUOTE:
原帖由 xiaoyafeng 于 2007-4-2 11:10 发表
8楼把callback和closure搞混了.
不过说老实话,我觉得map,和 grep设计很丑.如果能用引用就perfect.

一直以为map,grep这样挺好的,能解释一下吗?


QUOTE:
原帖由 福瑞哈哥 于 2007-4-2 11:42 发表

一直以为map,grep这样挺好的,能解释一下吗?

我觉得如果做成 File::Find::find 那样的更好。


QUOTE:
原帖由 flw 于 2007-4-2 12:29 发表

我觉得如果做成 File::Find::find 那样的更好。

各有利弊吧,

[Copy to clipboard] [ - ]
CODE:
ccb \&f, @a;
ccb f($_), @a;
ccb { $_ }, @a;

第一种形式使用函数引用,缺省传递$_,但是如果要传递其他参数了还得其他约定。


QUOTE:
原帖由 福瑞哈哥 于 2007-4-2 12:52 发表

但是如果要传递其他参数了还得其他约定。

那总比只能传递 $_ 要好吧?


QUOTE:
原帖由 flw 于 2007-4-2 12:29 发表

我觉得如果做成 File::Find::find 那样的更好。

哇!第一次跟你意见相同.


QUOTE:
原帖由 xiaoyafeng 于 2007-4-2 13:37 发表

哇!第一次跟你意见相同.

理论上是这样讲的。
但是实际上我从没碰到过因为这个限制而导致程序中出现冗余代码。
阅读了perl高级编程里面的闭合一节,上面说perl提供的是深度联编。做了个实验,果然是。

[Copy to clipboard] [ - ]
CODE:
{ my $aaa=100;{{{{ print "$aaa\n";}}}}}   #打印出了100



QUOTE:
闭包内幕:
变量名和变量值是两个分立的实体。当第一次看到$aaa时,perl会将名字$aaa同一个新分配

的标量变量值进行联编,并把值的引用计数设置为1(现在只有一个箭头指向值)。在代码结束时候

。perl会分断名子与值的关系,并将引用计数减一。如果没有别的指向那个值的引用,那么由于引

用计数已经递减为零,此值释放。但是上面例子中,碰巧匿名子例程要使用$aaa,于是使该变量

引用计数加一。这样就防止值被释放,从而保留。这里不能用local,因为local再第一部执行完,

就会恢复全局变量原值,后赋予的变量值不能保留。



QUOTE:
原帖由 大司南 于 2007-4-3 11:52 发表
阅读了perl高级编程里面的闭合一节,上面说perl提供的是深度联编。做了个实验,果然是。

[Copy to clipboard] [ - ]
CODE:
{ my $aaa=100;{{{{ print "$aaa\n";}}}}}   #打印出了100


就应该是这样的。
词法变量的作用域应该持续到闭合块结束为止。
C 里也是这样的。在外面的花括号开始处定义的局部变量,在嵌套包含的花括号内部也是可以访问的。


QUOTE:
词法变量的作用域应该持续到闭合块结束为止。
C 里也是这样的。在外面的花括号开始处定义的局部变量,在嵌套包含的花括号内部也是可以访问的。

学习。。。
今天看书看到回调和closures这一部分
发现lz那个例子很好,而下面这个例子

[Copy to clipboard] [ - ]
CODE:
例子a:
{my $cnt = 5;
  sub counter {
  return $cnt--;}
  }

我觉得是closures最简单的用法,而且很像是个给对象添加静态变量的样子
这里有个说法:“产生closures的过程就是利用回调来产生函数的集合,该函数集合以其他函数为基础”
sub pa{ my $test =shift; sub chi{ $test; } }
可以实现向pa传参,同时chi接受了pa内部的变量,而可以在chi中使用
可实现面向对象的很多语法,这个大概就是用途
否则,像例子a那样改变一个自己定义的感觉像静态变量的东西是不合适的
感觉很危险,closures用起来感觉就是有潜在危险
可以包裹多个子程序倒是挺有用的

不知道我的这些说法是否有问题,请指正