我认为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。
答案 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代码错误等等。 )。在纯线程环境中,这变得站不住脚,因为您需要以原子方式进行所有引用计数(通过使用硬件功能或通过锁定)。除了通常放慢速度之外,它开辟了一个全新的可能死锁池。