Perché Duration.new funziona con Int ma non con Rat?


9

Per una Durata, perché devo forzare manualmente un Ratto in un Reale, ma non un Int?

Questa è la versione Rakudo 2020.01 basata su MoarVM versione 2020.01.1 che implementa Perl 6.d. Su 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

Risposte:


10

Questo è un bug Che è stato corretto con https://github.com/rakudo/rakudo/commit/f70d95e299 .

La ragione per cui ha agito diversamente Ratrispetto a qualsiasi altro tipo, è che il Ratcaso è stato ottimizzato per non dover fare alcuna coercizione e quindi non è necessario verificare il risultato della coercizione. In tal caso, il valore è stato inserito direttamente nel nuovo Durationoggetto. Tuttavia, lo ha fatto senza de-containerizzare, quindi l' Durationoggetto avrebbe effettivamente fatto riferimento alla variabile $xdal tuo esempio. Tutto va bene in generale, ma la .gistlogica in qualche modo ha creato un ciclo infinito cercando di creare una rappresentazione del Durationperché di questo autoreferenzialità. Devo ammettere che non ho davvero esaminato dove esattamente è entrato in un ciclo.

Ad ogni modo, assicurandosi che il valore venga decontainerizzato all'interno Durationdell'oggetto, il problema scompare in quanto non può più essere autoreferenziale.


1
aha - grazie! Di solito con raku trovo che i bug siano miei e non del compilatore!
p6steve,

Domanda autoreferenziale!
SS Anne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.