ราคุโคลนวัตถุไม่จม

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';

ภาพพิมพ์ด้านบน:

sinking...2
Done

อย่างไรก็ตามหากใช้cloneวิธีการแบบกำหนดเองโคลนที่ส่งคืนจากcccจะไม่จมลงด้วยเหตุผลบางประการ มันทำงานได้ถ้าผมsinkอย่างชัดเจนที่เว็บไซต์สายหรือถ้าผมเปลี่ยนสายไปmy $clone = callwith(|%_) my $clone := callwith(|%_)เป็นไปตามคาดหรือไม่ อะไรคือสาเหตุที่มันทำงานในลักษณะนี้?

ขอบคุณ!

คำตอบ

3 raiph Aug 21 2020 at 07:21

มีข้อบกพร่องของซิงก์ที่ยื่นและยังคงเปิดอยู่หลายปีต่อมา (และฉันสงสัยว่าโหลดที่ยังไม่ได้ยื่น)

ดังที่ได้สัมผัสไว้ในคำตอบของฉันสำหรับองค์ประกอบสุดท้ายของบล็อกที่ถูกโยนในบริบทซิงก์ :

คนต้องการที่จะทำความสะอาดอ่างครัวคือเลือกที่ Zoffix ซ้ายปิดกับเขาข้อบกพร่องใน sinkage โดยนัย / และผู้ช่วยที่ไม่พึงประสงค์ปัญหา

ข้อสรุปของ Zoffix คือ:

เนื่องจากมีปัญหามากมายเกี่ยวกับระบบฉันแค่สงสัยว่าไม่มีสิ่งที่ดีกว่าที่จะใช้ระบุว่ามีบางอย่างที่ต้องการหรือไม่

ก้าวไปข้างหน้าอย่างรวดเร็ว 2 ปีและระบบที่ดีกว่านี้หวังว่าจะเข้าสู่ระบบ ในรายงานการให้ทุนล่าสุด jnthn เขียนว่า:

โค้ดปัจจุบันที่ทำงานนี้ใน Rakudo นั้นยากที่จะติดตามและไม่มีประสิทธิภาพมากนัก ... เนื่องจาก RakuAST สร้างโมเดลภาษาในระดับที่สูงขึ้นและเลื่อนการผลิต QAST ออกไปก่อนหน้านี้มากจึงเป็นวิธีแก้ปัญหาที่สะอาดกว่าสำหรับปัญหาการวิเคราะห์ซิงก์ ... ฉันมองโลกในแง่ดีว่าแบบจำลองที่ฉันสร้างขึ้นจะมีความยืดหยุ่นเพียงพอที่จะรองรับข้อกำหนดที่เกี่ยวข้องกับการจมทั้งหมด

2 ElizabethMattijsen Aug 20 2020 at 21:10

ฉันไม่แน่ใจว่าเกิดอะไรขึ้น แต่การลบreturnคำสั่งทำให้วัตถุโคลนเรียกsinkวิธีการที่ถูกต้อง

ฉันได้สร้างปัญหาสำหรับมัน: https://github.com/rakudo/rakudo/issues/3855