没有类的析构函数

Pau*_*han 2 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

bri*_*foy 5

我只是为了这个而使用一个类.祝福子程序参考,仍然像你一样使用它.该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,但那只是一个对象了.