Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 无类析构函数_Perl_Closures - Fatal编程技术网

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,我不能随便说出任何其他语言);它通常被称为终结器,而不是析构函数(名称“析构函数”表示显式内存释放)。系统函数接收要监视的对象(呃,值),以及在对象死后调用的函数。