Perl 无类析构函数
假设我有一个返回闭包的函数:Perl 无类析构函数,perl,closures,Perl,Closures,假设我有一个返回闭包的函数: 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_ha
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\u something\u happe
n从范围中删除时,我能够调用一些$resource->cleanup()代码>
当然,如果我有一个类,我可以用析构函数来完成这项工作,但对于我想做的事情来说,这似乎有点重。从建模对象的意义上来说,这并不是一个真正的“对象”,它只是一个功能性的东西,需要在启动时和死前立即执行一些代码
我如何在Perl中做到这一点(出于好奇,是否有任何语言支持这一想法)?我将使用一个类来实现这一点。祝福子程序引用,并像您一样使用它。get\u资源
然后使用该类。因为我不知道它是什么样子,所以我将让您来集成它:
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
,但这又只是一个对象。我只需要使用一个类就可以了。祝福子程序引用,并像您一样使用它。get\u资源
然后使用该类。因为我不知道它是什么样子,所以我将让您来集成它:
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作为一个纽带来实现这一点,但这又只是一个对象。我想我理解您的问题。就我而言,我想要:
*可在脚本运行时的任何时间点设置的全局变量
*持续到脚本生命结束
*明确地清理它
看起来我可以通过定义一个结束块来实现这一点;它将“尽可能晚地”运行。
您应该能够执行$resource->cleanup();在上面
详情如下:
该页面上的begincheck程序有代码。我想我理解你的问题。就我而言,我想要:
*可在脚本运行时的任何时间点设置的全局变量
*持续到脚本生命结束
*明确地清理它
看起来我可以通过定义一个结束块来实现这一点;它将“尽可能晚地”运行。
您应该能够执行$resource->cleanup();在上面
详情如下:
该页面上的begincheck程序有代码。是的,其他一些语言支持这一点(尽管除了一些常见的Lisp实现(如SBCL)之外,我不能随便说出其他语言);它通常被称为终结器,而不是析构函数(名称“析构函数”表示显式内存释放)。一个系统函数需要观察对象(呃,值)和在它死后调用的函数。是的,其他一些语言支持这一点(尽管除了一些常见的Lisp实现,比如SBCL,我不能随便说出任何其他语言);它通常被称为终结器,而不是析构函数(名称“析构函数”表示显式内存释放)。系统函数接收要监视的对象(呃,值),以及在对象死后调用的函数。