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

时间:2018-06-13 00:19:43

标签: perl6 finalizer raku

我认为Rakudo几年前获得了终结者支持,但我无法找到它的文档(可能是Classes and Objects)。列出类中的所有方法并不像我正在寻找的东西。

class Butterfly {
    method DESTROY { put "Destroyed" }
    # submethod DESTROY { put "Destroyed" }
    }
{
Butterfly.new;
}

问题可能是#127243: [RFC] DESTROY is not called on interpreter exit

啊,标记为"做"在roast/S12-construction/destruction.t

1 个答案:

答案 0 :(得分:12)

Perl 6中没有可靠的对象终结。支持DESTROY,但只有在实际对象进行垃圾回收时才会调用它。垃圾收集在全局关闭时发生,但在需要时(根据它决定的任何启发式方法)。

以下代码显示对象被垃圾回收时,他们会调用DESTROY

my int $destroyed;
class A {
    method DESTROY { ++$seen }
}
A.new for ^50000;
say "DESTROY called $destroyed times";

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

如果您想要可靠的破坏,可以使用LEAVE阶段或will leave特征:

my $dbh = DBI.connect(....);
LEAVE $dbh.disconnect;

或更短:

my $foo will leave { say "left with $_" } = 42;
# left with 42

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