假设我有一个返回闭包的函数:
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();
}
Run Code Online (Sandbox Code Playgroud)
我希望能够确保当$make_something_happen从范围中删除时,我可以调用一些$resource->cleanup();
当然,如果我有一个类,我可以使用析构函数来做这个,但对于我想要做的事情,这似乎有点重量级.在构建对象的意义上,这实际上不是一个"对象",它只是一个需要在启动时和死亡之前执行某些代码的功能.
我如何在Perl中做到这一点(出于好奇,任何语言都支持这个想法)?
我只是为了这个而使用一个类.祝福子程序参考,仍然像你一样使用它.该get_resource然后使用这个类.既然我不知道那是什么样的,我会留给你整合它:
package Gozer {
sub new {
my( $class, $subref );
bless $subref, $class;
}
sub DESTROY {
...; #cleanup
}
}
Run Code Online (Sandbox Code Playgroud)
如果每个东西都可以拥有它自己的清理,我会使用该类对两个代码引用进行分组:
package Gozer {
sub new {
my( $class, $subref, $cleanup );
bless { run => $subref, cleanup => $cleanup }, $class;
}
sub DESTROY {
$_[0]{cleanup}();
}
}
Run Code Online (Sandbox Code Playgroud)
在Perl中,我认为这不是重量级的.对象系统只是将标签附加到引用.并非每个对象都需要对某些东西进行建模,因此这是一种非常精细的对象.
在普通变量上使用某种终结器会很好,但我认为这些最终会在拓扑上变成同样的东西.你可以用Perl作为a tie,但那只是一个对象了.