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

14

3
Jonathan Worthington在GitHub的一个问题中给出了详细的答复,该问题是由这个问题引起的:https://github.com/perl6/doc/issues/2097#issuecomment-396881299 - brian d foy
1个回答

14

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

以下代码显示了对象何时被垃圾回收时调用DESTROY的情况:

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

通常输出类似于"DESTROY被调用31095次"。

如果您想要可靠的销毁,可以使用LEAVE phasers或will leave trait:

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

或者更短:

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

人们应该意识到,可靠销毁对象的引用计数法存在其问题(例如循环引用需要弱引用、共享内存无法共享因为需要更新计数器、XS代码出错等等)。在一个纯线程环境中,这变得不可行,因为您需要以原子方式执行所有引用计数(通过使用硬件特性或锁定)。这不仅会普遍减慢事情的速度,还会打开一整个可能死锁的新领域。


2
嗨,丽兹。"在 Perl 6 中没有可靠的对象完成机制"。但是你的 FINALIZER 模块中有这个机制,对吧? - raiph
1
原则上是可以的,但我不知道除了我之外还有没有人尝试过使用它,所以可能还有一些问题需要解决。 - Elizabeth Mattijsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接