Perl 6在清理对象时会自动调用任何特殊方法吗?

bri*_*foy 13 finalizer perl6 raku

我认为Rakudo几年前获得了终结器支持,但我找不到它的文档(也许它在Classes和Objects中).列出类中的所有方法似乎不是我想要的东西.

class Butterfly {
    method DESTROY { put "Destroyed" }
    # submethod DESTROY { put "Destroyed" }
    }
{
Butterfly.new;
}
Run Code Online (Sandbox Code Playgroud)

也许问题是#127243:[RFC] DESTROY没有在解释器退出时调用

啊,并在烤/ S12-construction/destruction.t中标记为"待办事项" .

Eli*_*sen 14

在Perl 6中没有可靠的对象终结.有支持DESTROY,但只有当对象实际上是垃圾回收时才会被调用.垃圾收集并没有发生在全球的关闭,但是当(由它决定,无论启发式)需要它.

以下代码显示对象被垃圾收集时,它们会调用DESTROY:

my int $destroyed;
class A {
    method DESTROY { ++$seen }
}
A.new for ^50000;
say "DESTROY called $destroyed times";
Run Code Online (Sandbox Code Playgroud)

通常会输出如下内容:"DESTROY称为31095次".

如果你想要可靠的破坏,你可以使用阶段LEAVEwill leave特征:

my $dbh = DBI.connect(....);
LEAVE $dbh.disconnect;
Run Code Online (Sandbox Code Playgroud)

或更短:

my $foo will leave { say "left with $_" } = 42;
# left with 42
Run Code Online (Sandbox Code Playgroud)

人们应该意识到,允许可靠销毁的引用计数存在问题(循环引用,因此需要弱引用,共享内存取消共享,因为它需要更新计数器,XS代码错误等等).在纯线程环境中,这变得站不住脚,因为您需要以原子方式进行所有引用计数(通过使用硬件功能或通过锁定).除了通常放慢速度之外,它还开辟了一个全新的可能死锁池.

  • 嗨,丽兹 “ Perl 6中没有可靠的对象终结处理。” 但是您的[FINALIZER](https://modules.perl6.org/dist/FINALIZER)模块中有对吗? (2认同)