ราคุโคลนวัตถุไม่จม
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';
ภาพพิมพ์ด้านบน:
sinking...2
Done
อย่างไรก็ตามหากใช้clone
วิธีการแบบกำหนดเองโคลนที่ส่งคืนจากccc
จะไม่จมลงด้วยเหตุผลบางประการ มันทำงานได้ถ้าผมsink
อย่างชัดเจนที่เว็บไซต์สายหรือถ้าผมเปลี่ยนสายไปmy $clone = callwith(|%_)
my $clone := callwith(|%_)
เป็นไปตามคาดหรือไม่ อะไรคือสาเหตุที่มันทำงานในลักษณะนี้?
ขอบคุณ!
คำตอบ
มีข้อบกพร่องของซิงก์ที่ยื่นและยังคงเปิดอยู่หลายปีต่อมา (และฉันสงสัยว่าโหลดที่ยังไม่ได้ยื่น)
ดังที่ได้สัมผัสไว้ในคำตอบของฉันสำหรับองค์ประกอบสุดท้ายของบล็อกที่ถูกโยนในบริบทซิงก์ :
คนต้องการที่จะทำความสะอาดอ่างครัวคือเลือกที่ Zoffix ซ้ายปิดกับเขาข้อบกพร่องใน sinkage โดยนัย / และผู้ช่วยที่ไม่พึงประสงค์ปัญหา
ข้อสรุปของ Zoffix คือ:
เนื่องจากมีปัญหามากมายเกี่ยวกับระบบฉันแค่สงสัยว่าไม่มีสิ่งที่ดีกว่าที่จะใช้ระบุว่ามีบางอย่างที่ต้องการหรือไม่
ก้าวไปข้างหน้าอย่างรวดเร็ว 2 ปีและระบบที่ดีกว่านี้หวังว่าจะเข้าสู่ระบบ ในรายงานการให้ทุนล่าสุด jnthn เขียนว่า:
โค้ดปัจจุบันที่ทำงานนี้ใน Rakudo นั้นยากที่จะติดตามและไม่มีประสิทธิภาพมากนัก ... เนื่องจาก RakuAST สร้างโมเดลภาษาในระดับที่สูงขึ้นและเลื่อนการผลิต QAST ออกไปก่อนหน้านี้มากจึงเป็นวิธีแก้ปัญหาที่สะอาดกว่าสำหรับปัญหาการวิเคราะห์ซิงก์ ... ฉันมองโลกในแง่ดีว่าแบบจำลองที่ฉันสร้างขึ้นจะมีความยืดหยุ่นเพียงพอที่จะรองรับข้อกำหนดที่เกี่ยวข้องกับการจมทั้งหมด
ฉันไม่แน่ใจว่าเกิดอะไรขึ้น แต่การลบreturn
คำสั่งทำให้วัตถุโคลนเรียกsink
วิธีการที่ถูกต้อง
ฉันได้สร้างปัญหาสำหรับมัน: https://github.com/rakudo/rakudo/issues/3855