Objek kloning Raku tidak tenggelam

Aug 20 2020
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 clonemetode kustom digunakan, klon yang dikembalikan dari ccctidak akan tenggelam karena beberapa alasan. Ini berfungsi jika saya sinksecara 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

3 raiph Aug 21 2020 at 07:21

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

2 ElizabethMattijsen Aug 20 2020 at 21:10

Saya tidak yakin apa yang sedang terjadi, tetapi menghapus returnpernyataan tersebut membuat objek kloning memanggil sinkmetode yang benar .

Saya telah membuat masalah untuk itu: https://github.com/rakudo/rakudo/issues/3855