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

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é.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.