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次".
如果你想要可靠的破坏,你可以使用阶段LEAVE或will 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代码错误等等).在纯线程环境中,这变得站不住脚,因为您需要以原子方式进行所有引用计数(通过使用硬件功能或通过锁定).除了通常放慢速度之外,它还开辟了一个全新的可能死锁池.