没有类的析构函数

时间:2012-03-26 22:14:21

标签: 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_happen();
}

我希望能够确保从范围中删除$make_something_happe n时,我可以调用一些$resource->cleanup();

当然,如果我有一个类,我可以使用析构函数来做这个,但对于我想要做的事情,这似乎有点重量级。在构建对象的意义上,这不是一个真正的“对象”,它只是一个需要在启动时和死亡之前立即执行某些代码的功能。

我如何在Perl中做到这一点(出于好奇,任何语言都支持这个想法)?

2 个答案:

答案 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程序包含代码。