Duration.newがIntでは機能するがRatでは機能しないのはなぜですか?


9

持続時間について、なぜ私はラットを実数に強制する必要があるが、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

回答:


10

これはバグです。これはhttps://github.com/rakudo/rakudo/commit/f70d95e299で修正されています

Rat他のタイプとは異なる動作をした理由は、Ratケースが強​​制を行う必要がないように最適化されたため、強制の結果をチェックする必要がないためです。その場合、値は新しいDurationオブジェクトに直接入力されました。ただし、コンテナ化を解除することなくそうしたため、Durationオブジェクトは実際には$xサンプルの変数を参照しています。これはすべて一般的には問題ありませんが、この.gistロジックは何らかのDuration理由で、この自己参照のためにの表現を作成しようとする無限ループを作成しました。私が実際にループに入った場所を実際に調べていなかったことを認めなければなりません。

とにかく、値がDurationオブジェクト内でコンテナ化されていないことを確認することで、問題がなくなります。問題が解消されるのは、自己参照できなくなるからです。


1
ああ-ありがとう!通常、rakuを使用すると、バグはコンパイラではなく自分のものであることがわかります。
p6steve

自己参照の質問!
SSアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.