Objek kloning Raku tidak tenggelam
class A {
has $.n; # If this method is uncommented then the clone won't be sunk # method clone { # my $clone = callwith(|%_);
# return $clone; # } method sink(-->Nil) { say "sinking...$!n" }
}
sub ccc(A:D $a) { $a.clone(n=>2) }
ccc(A.new(n=>1));
say 'Done';
Cetakan di atas:
sinking...2
Done
Namun, jika clone
metode kustom digunakan, klon yang dikembalikan dari ccc
tidak akan tenggelam karena beberapa alasan. Ini berfungsi jika saya sink
secara eksplisit di situs panggilan atau jika saya mengubah my $clone = callwith(|%_)
jalur ke my $clone := callwith(|%_)
. Apakah ini diharapkan? Apa alasannya bekerja seperti ini?
Terima kasih!
Jawaban
Ada banyak bug sink yang diajukan-dan-masih-buka-bertahun-tahun kemudian (dan, saya curiga, muatan yang belum diajukan).
Seperti yang disinggung dalam jawaban saya untuk elemen terakhir dari blok yang dilempar dalam konteks wastafel :
seseorang perlu membersihkan wastafel dapur, yaitu melanjutkan di mana Zoffix tinggalkan dengan Cacatnya dalam masalah pembuangan yang tersirat / & pembantu yang tidak diinginkan .
Kesimpulan Zoffix adalah:
Jadi mengingat ada begitu banyak masalah dengan sistem, saya hanya ingin tahu apakah tidak ada yang lebih baik yang dapat digunakan untuk menunjukkan apakah ada sesuatu yang diinginkan atau tidak.
Maju cepat 2 tahun, dan sistem yang lebih baik semoga akan segera hadir. Dalam laporan hibah terbaru jnthn menulis:
Kode saat ini yang melakukan pekerjaan ini di Rakudo sulit untuk diikuti dan tidak terlalu efisien. ... Karena RakuAST memodelkan bahasa pada tingkat yang lebih tinggi dan menunda memproduksi QAST hingga beberapa saat kemudian, solusi yang jauh lebih bersih untuk masalah analisis sink dimungkinkan. ... Saya optimis bahwa model yang saya buat akan cukup fleksibel untuk menangani semua persyaratan terkait penenggelaman
Saya tidak yakin apa yang sedang terjadi, tetapi menghapus return
pernyataan tersebut membuat objek kloning memanggil sink
metode yang benar .
Saya telah membuat masalah untuk itu: https://github.com/rakudo/rakudo/issues/3855