Mengapa Duration.new baru bekerja dengan Int tetapi tidak Rat?


9

Untuk Durasi, mengapa saya perlu memaksa Rat ke Real dengan tangan, tetapi bukan Int?

Ini adalah Rakudo versi 2020.01 yang dibangun di atas MoarVM versi 2020.01.1 yang mengimplementasikan Perl 6.d. Di 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

Jawaban:


10

Ini adalah bug. Yang telah diperbaiki dengan https://github.com/rakudo/rakudo/commit/f70d95e299 .

Alasan mengapa ia bertindak secara berbeda Ratdaripada untuk jenis lainnya, adalah bahwa Ratkasus ini dioptimalkan untuk tidak harus melakukan paksaan, dan dengan demikian tidak perlu memeriksa hasil dari paksaan. Dalam hal ini, nilainya dimasukkan langsung ke Durationobjek baru . Namun, ia melakukannya tanpa menghapus wadah, sehingga Durationobjek sebenarnya akan mereferensikan variabel $xdari contoh Anda. Ini semua baik - baik saja secara umum, tetapi.gist entah bagaimana logika membuat loop tak terbatas mencoba membuat representasi Durationkarena referensi-diri ini. Harus kuakui aku tidak benar-benar melihat ke mana tepatnya ia berada dalam satu lingkaran.

Ngomong-ngomong, dengan memastikan bahwa nilai didekontainerkan di dalam Durationobjek, masalahnya hilang karena tidak bisa menjadi referensi sendiri lagi.


1
aha - terima kasih! Biasanya dengan raku saya menemukan bug milikku dan bukan kompiler!
p6steve

Pertanyaan referensi diri!
SS Anne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.