- 论坛徽章:
- 0
|
本帖最后由 littlelittledog 于 2013-06-16 06:44 编辑
今天在看high order perl,对prototype的用法有些疑惑,希望高手可以解释以下:
use strict;
use warnings;
sub upto {
my ($m,$n)=@_;
return Iterator {
return $m<=$n?$m++:undef;
};
}
sub Iterator (&) { return $_[0]}
my $it=upto(3,5);
while(defined(my $val=$it->())){
print "$val\n";
}
错误提示:
Can't use string ("3") as a subroutine ref while "strict refs" in use at ./upto.pl line 35.
但是如果改成下面的代码就没有问题:
sub upto {
my ($m,$n)=@_;
return Iterator(sub {
return $m<=$n?$m++:undef;
});
}
sub Iterator (&) { return $_[0]}
my $it=upto(3,5);
while(defined(my $val=$it->())){
print "$val\n";
}
结果如下:
3
4
5
很明显,上面的错误是closure的编译时没有lazy evaluation,返回了值,而不是closure的问题。是不是modern perl(v5.10+)中不可以使用第一种方式了?
|
|