Pourquoi Duration.new fonctionne avec Int mais pas Rat?

9

Pendant une durée, pourquoi dois-je contraindre un Rat à un Real à la main, mais pas un Int?

Il s'agit de la version 2020.01 de Rakudo construite sur la version 2020.01.1 de MoarVM implémentant Perl 6.d. Sur 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
la source

Réponses:

10

Ceci est un bug. Ce qui a été corrigé avec https://github.com/rakudo/rakudo/commit/f70d95e299 .

La raison pour laquelle il a agi différemment Ratque pour tout autre type est que le Ratboîtier a été optimisé pour ne pas avoir à exercer de coercition et qu'il n'était donc pas nécessaire de vérifier le résultat de la coercition. Dans ce cas, la valeur a été placée directement dans le nouvel Durationobjet. Cependant, il l'a fait sans dé-conteneurisation, donc l' Durationobjet ferait en fait référence à la variable $xde votre exemple. C'est très bien en général, mais la .gistlogique a en quelque sorte créé une boucle infinie essayant de créer une représentation du en Durationraison de cette auto-référence. Je dois admettre que je n'ai pas vraiment cherché à savoir où cela s'est exactement mis en boucle.

Quoi qu'il en soit, en s'assurant que la valeur est décontainérisée à l'intérieur de l' Durationobjet, le problème disparaît car il ne peut plus être auto-référencé.

Elizabeth Mattijsen
la source
1
aha - merci! Habituellement, avec raku, je trouve que les bugs sont les miens et non le compilateur!
p6steve
Question autoréférentielle!
SS Anne