ทำไม Duration.new ทำงานกับ Int แต่ไม่ได้ Rat?


9

สำหรับช่วงเวลาทำไมฉันต้องบีบบังคับให้หนูเป็นจริงด้วยมือ แต่ไม่ใช่ Int?

นี่คือ Rakudo รุ่น 2020.01 ที่สร้างขึ้นบน MoarVM เวอร์ชัน 2020.01.1 การใช้ Perl 6.d บน 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

คำตอบ:


10

นี่เป็นข้อผิดพลาด ซึ่งได้รับการแก้ไขด้วยhttps://github.com/rakudo/rakudo/commit/f70d95e299

เหตุผลที่ทำหน้าที่แตกต่างRatจากประเภทอื่นคือRatกรณีนี้ได้รับการปรับให้เหมาะสมโดยไม่ต้องทำการข่มขู่และไม่จำเป็นต้องตรวจสอบผลลัพธ์ของการขู่เข็ญ ในกรณีนั้นค่าจะถูกใส่โดยตรงไปยังDurationวัตถุใหม่ อย่างไรก็ตามมันทำได้โดยไม่มีการลดขนาดคอนเทนเนอร์ดังนั้นDurationวัตถุจะอ้างอิงตัวแปร$xจากตัวอย่างของคุณ นี่เป็นเรื่องปกติ แต่โดยทั่วไปแล้ว.gistตรรกะก็สร้างวงวนไม่สิ้นสุดที่พยายามสร้างการแทนDurationเพราะการอ้างอิงตนเองนี้ ต้องยอมรับว่าฉันไม่ได้มองเข้าไปในที่ที่มันเข้าสู่วงอย่างแน่นอน

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


1
aha - ขอบคุณ! โดยปกติแล้วกับ raku ฉันพบว่าแมลงเป็นของฉันและไม่ใช่ผู้แปล!
p6steve

คำถามอ้างอิงตนเอง!
SS Anne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.