Dlaczego Duration.new działa z Int, ale nie z Rat?

9

Dlaczego przez pewien czas muszę ręcznie zmusić Szczura do Reala, ale nie Inta?

To jest wersja Rakudo 2020.01 zbudowana na MoarVM wersja 2020.01.1 implementująca Perl 6.d. Na 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
źródło

Odpowiedzi:

10

To jest błąd. Co zostało naprawione w https://github.com/rakudo/rakudo/commit/f70d95e299 .

Powodem, dla którego działał inaczej Ratniż w przypadku jakiegokolwiek innego rodzaju, jest to, że Ratsprawa została zoptymalizowana, aby nie musiała wykonywać żadnego przymusu, a zatem nie musiała sprawdzać wyniku przymusu. W takim przypadku wartość została wstawiona bezpośrednio do nowego Durationobiektu. Jednak zrobiło to bez usuwania kontenerów, więc Durationobiekt faktycznie odwoływałby się do zmiennej $xz twojego przykładu. Ogólnie wszystko jest w porządku, ale .gistlogika jakoś stworzyła nieskończoną pętlę, próbując stworzyć reprezentacjęDuration powodu tego odniesienia do samego siebie. Muszę przyznać, że tak naprawdę nie sprawdziłem, gdzie dokładnie wpadł w pętlę.

W każdym razie, upewniając się, że wartość zostaje zdekontaineryzowana wewnątrz Durationobiektu, problem zniknie, ponieważ wtedy nie będzie już mógł odnosić się do siebie.

Elizabeth Mattijsen
źródło
1
aha - dzięki! Zazwyczaj w przypadku raku błędy są moje, a nie kompilator!
p6steve
Pytanie autoreferencyjne!
SS Anne