Warum funktioniert Duration.new mit Int, aber nicht mit Rat?

9

Warum muss ich für eine Dauer eine Ratte von Hand zu einem Real zwingen, aber nicht zu einem Int?

Dies ist Rakudo Version 2020.01, die auf MoarVM Version 2020.01.1 basiert und Perl 6.d implementiert. Unter 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
p6steve
quelle

Antworten:

10

Dies ist ein Fehler. Welches wurde mit https://github.com/rakudo/rakudo/commit/f70d95e299 behoben .

Der Grund, warum es anders wirkte Ratals für jeden anderen Typ, ist, dass der RatFall so optimiert wurde, dass kein Zwang ausgeübt werden musste und daher das Ergebnis des Zwangs nicht überprüft werden musste. In diesem Fall wurde der Wert direkt in das neue DurationObjekt eingefügt. Dies geschah jedoch ohne Entcontainerisierung, sodass das DurationObjekt tatsächlich auf die Variable $xaus Ihrem Beispiel verweist . Dies ist im Allgemeinen alles in Ordnung, aber die .gistLogik hat irgendwie eine Endlosschleife erzeugt, die versucht, Durationaufgrund dieser Selbstreferenz eine Darstellung der zu erstellen . Ich muss zugeben, dass ich nicht wirklich untersucht habe, wo es genau in eine Schleife geraten ist.

Wenn Sie sicherstellen, dass der Wert im DurationObjekt dekontainiert wird, verschwindet das Problem, da er sich nicht mehr selbst referenzieren kann.

Elizabeth Mattijsen
quelle
1
aha - danke! Normalerweise finde ich bei Raku, dass die Fehler meine sind und nicht der Compiler!
p6steve
Selbstreferenzielle Frage!
SS Anne