编程时多多思考吧,别光掌握perl的古怪用法而不理解其精髓!



QUOTE:
原帖由 shhgs 于 2007-9-20 06:40 发表
%d =();
{
   my $var = 7;
   sub a {
      return $var;
   }
}

@a = grep {
    ! $d{$_} and $d{$_} = 1;
} (1..10);

@b = grep { $_ % a == 0 } (1..100);

grep是不是通过调用这个block访问到了它的作用域之外的数据了?这个block难道不是closure吗?

这里用到闭包的是a,不是grep吧


QUOTE:
原帖由 orangetouch 于 2007-9-20 10:11 发表

这里用到闭包的是a,不是grep吧

你是对的。

他那是两组例子,
第一组,grep 的块中访问了 %d,于是他就认为 grep 的块是闭包。
第二组,grep 的块中调用了另一个闭包 sub a,于是他认为 grep 的块是闭包。
按照他的观点,“一切可以访问外部数据的闭合块都是闭包”
这个观点是错误的。
比如在 C 语言中:

[Copy to clipboard] [ - ]
CODE:
# include <stdio.h>

int global_i = 10;

void func( void )
{
    global_i = 3;
}

int main( void )
{
      global_i = 1;
      func();
}

我们能说 func 或者 main 是闭包吗?


QUOTE:
原帖由 shhgs 于 2007-9-20 11:07 发表
我特地给了这个@b,本想告诉你们grep是怎样通过这个block访问到了原本没法访问的数据。但看来我白费力气了。

@b?
你是说第二组例子的 grep 的返回结果?
这个和闭包有关系吗?

> 本想告诉你们grep是怎样通过这个block访问到了原本没法访问的数据。
你指的是哪个变量?

至于你后面举的那个例子,和闭包没半点儿关系。
那是一个动态加载模块的例子。



QUOTE:
原帖由 shhgs 于 2007-9-20 11:11 发表
其实说到底,还是一个应该是怎样,和Perl是怎样的问题。

Perler熟悉的是Perl是怎样,他们根本不知道应该是怎样,也不关心应该是怎样,甚至还认为Perl的就是应该的。

可叹,可笑,可悲,可怜!

警告你一下,下次请不要再发表这种空洞无物的言论。
否则一律删除。
本次的先留作证据。


QUOTE:
原帖由 shhgs 于 2007-9-20 11:37 发表
这不是空洞无物,相反,它指出了问题的症结。这才是这个讨论里最有价值的一帖。

那就只好请你出局了。


QUOTE:
原帖由 shhgs 于 2007-4-2 07:25 发表
closure的本意,其实是给别人一个窗口,让人家能访问到你自己。

认真的看了看 closure 方面的一些文章,觉得 shhgs 的这个看法是不对的。

QUOTE:
One of the potentially useful things you can do with closures is generate subroutines dynamically based on a template.

觉得这个讲的和 Simon 讲的有些类似,还没看完,继续看。

你们继续讨论啊,这种帖子挺好。

QUOTE:
You can also use closures to enforce strict data encapsulation, since they allow you to create variables that simply don't exist to the outside world.



QUOTE:
原帖由 DennisRitchie 于 2007-9-19 22:46 发表
TO flw:
你警告我说这贴是水贴,那我就编辑掉了,不过25楼、26楼似乎也是水贴,希望你也警告他们一下。

似乎是水贴?怎么这里也讲“莫须有”?