为什么Duration.new可以与Int一起使用但不能与Rat一起使用?


9

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

这是Rakudo 2020.01版,建立在实现Perl 6.d的MoarVM 2020.01.1版上。在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

Answers:


10

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

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

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


1
啊哈-谢谢!通常使用raku我会发现错误是我的,而不是编译器!
p6steve

自问的问题!
SS Anne
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.