假设我有一个返回闭包的函数:
sub generator
{
my $resource = get_resource();
my $do_thing = sub
{
$resource->do_something();
}
return $do_thing;
}
# new lexical scope
{
my $make_something_happen = generator();
&$make_something_happen();
}
我希望能够确保从范围中删除$make_something_happe
n时,我可以调用一些$resource->cleanup();
当然,如果我有一个类,我可以使用析构函数来做这个,但对于我想要做的事情,这似乎有点重量级。在构建对象的意义上,这不是一个真正的“对象”,它只是一个需要在启动时和死亡之前立即执行某些代码的功能。
我如何在Perl中做到这一点(出于好奇,任何语言都支持这个想法)?
答案 0 :(得分:5)
我只是为此使用了一个类。祝福子程序参考,仍然像你一样使用它。 get_resource
然后使用此类。由于我不知道那是什么样的,我会留给你整合它:
package Gozer {
sub new {
my( $class, $subref );
bless $subref, $class;
}
sub DESTROY {
...; #cleanup
}
}
如果每个东西都有它自己的清理,我会使用该类对两个代码引用进行分组:
package Gozer {
sub new {
my( $class, $subref, $cleanup );
bless { run => $subref, cleanup => $cleanup }, $class;
}
sub DESTROY {
$_[0]{cleanup}();
}
}
在Perl中,我认为这不是重量级的。对象系统只是将标签附加到引用。并非每个对象都需要对某些东西进行建模,因此这是一个非常精细的对象。
在普通变量上使用某种终结器会很好,但我认为这些最终会在拓扑上变成同样的东西。您可以使用Perl作为tie
,但这只是一个对象。
答案 1 :(得分:-1)
我想我理解你的问题。在我的情况下,我想:
*可在脚本运行时期间的任何时刻设置的全局变量
*持续到脚本的生命周期结束
*明确地清理它。
看起来我可以通过定义END块来做到这一点;它将“尽可能晚地”运行。 你应该可以做你的$ resource-> cleanup();在那里。
更多信息: http://perldoc.perl.org/perlmod.html#BEGIN%2c-UNITCHECK%2c-CHECK%2c-INIT-and-END
该页面上的begincheck程序包含代码。