假设我有 sub1() 和 sub2()。 sub2 仅从 sub1 调用。使用匿名 sub 来最小化 sub2 的范围,以便只有 sub1 可以看到 sub2 是好的做法吗?
示例 1(范围未最小化):
sub sub_called_only_in_calc {
#do s.th
#return s.th
}
sub calc {
my $n = sub_called_only_in_calc(1,2,3);
#...
return $n;
}
示例 2(使用匿名子最小化范围):
sub calc {
#my or state
my $sub_called_only_in_calc = sub {
#do s.th
#return s.th
};
my $n = $sub_called_only_in_calc->(1,2,3);
#or
#my $n = sub {
#do s.th
#return s.th
#}->(1,2,3);
return $n;
}
最佳答案
不同的人会有不同的意见,但我的意见是,在限制访问很重要的情况下,使用词法标量来本地化对子例程的访问可能是一种有用的技术;例如,当这些子例程可能被未经授权的人恶意调用时,通常是通过网页。
如果您考虑这样做只是为了防止编码错误(调用错误的子例程)或允许多个子例程具有相同的标识符,那么我会说您是在浪费时间。无论如何,前者是一个可以忽略不计的问题,我怀疑这项措施不会显着减少;而后者通常应该使用包来实现:这就是它们的设计目的。
大多数 Perl 模块通过在子例程标识符前加下划线来限制仅隐式访问。
记住拉里的这句话
Perl doesn't have an infatuation with enforced privacy. It would prefer that you stayed out of its living room because you weren't invited, not because it has a shotgun
虽然 Larry 的许多原始想法可以被认为与后来的 Perl 版本无关,但我认为这一个仍然有效。
关于perl - 使用匿名 subs 最小化 Perl 中的子范围是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22094939/