为什么Duration.new与Int一起使用,但对Rat不起作用?

问题描述 投票:9回答:1

对于持续时间,为什么我需要手动将老鼠强制为实数,而不是整数?

这是基于MoarVM 2020.01.1版构建的Rakudo 2020.01版实施Perl6.d。在OSX上。

say $v.WHAT; #(Int)
$v = Duration.new( $v );
say $v;     #20 

my $w = 20.0;
say $w.WHAT; #(Rat)
$w = Duration.new( $w.Real );
say $w;     #20 

my $x = 20.0;
say $x.WHAT; #(Rat)
$x = Duration.new( $x );
say $x;     #hangs
raku
1个回答
10
投票

这是一个错误。已用https://github.com/rakudo/rakudo/commit/f70d95e299修复的问题。

它对Rat的作用不同于任何其他类型的原因是,对Rat情况进行了优化,使其不必执行任何强制性操作,因此不需要检查强制性结果。在这种情况下,该值将直接放入新的Duration对象中。但是,它这样做没有取消容器化,因此Duration对象实际上将引用您示例中的变量$x。通常,这一切都很好,但是由于这种自引用,.gist逻辑以某种方式创建了一个无限循环,试图创建Duration的表示形式。必须承认,我并没有真正研究它到底陷入了什么循环。

无论如何,通过确保值在Duration对象中被取消容器化,问题消失了,因为它不再可以自我引用了。

© www.soinside.com 2019 - 2024. All rights reserved.