对于 Duration,为什么我需要手动将 Rat 强制为 Real 而不是 Int?
这是基于实施 Perl 6.d 的 MoarVM 2020.01.1 版构建的 Rakudo 2020.01 版。在 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
Run Code Online (Sandbox Code Playgroud)
Eli*_*sen 10
这是一个错误。已通过https://github.com/rakudo/rakudo/commit/f70d95e299修复。
它的行为与Rat任何其他类型不同的原因是,Rat案例被优化为不必进行任何强制,因此不需要检查强制的结果。在这种情况下,该值被直接放入新Duration对象中。但是,它没有去容器化就这样做了,因此该Duration对象实际上会引用$x您示例中的变量。一般来说,这一切都很好,但是由于这种自我引用,.gist逻辑以某种方式创建了一个无限循环,试图创建 的表示Duration。必须承认,我并没有真正研究它到底在哪里进入循环。
无论如何,通过确保值在Duration对象内部被解容器,问题就会消失,因为它不能再自引用了。
| 归档时间: |
|
| 查看次数: |
182 次 |
| 最近记录: |