ทำไมค่าเริ่มต้นของ Raku ถ้า / while / loop / เมื่อบล็อกทั้งหมดมีค่าตัวตนเดียวกัน (.WHICH)


9

ยกเว้นบล็อกที่ฉันประกาศลายเซ็นบล็อกทั้งหมดมีค่าตัวเดียวกันและอ้างว่าจะประกาศในบรรทัดที่ 1 โดยไม่คำนึงถึงที่ที่พวกเขาเกิดขึ้น มีใครบ้างไหมที่ให้ความกระจ่างว่าทำไมถึงเป็นเช่นนี้?

say 「Let's look at some blocks…」;

if True {
  &?BLOCK.say;
}

while True {
  &?BLOCK.say;
  last;
}

loop {
  &?BLOCK.say;
  last;
}

if True -> | {
  「I'm different!」.say;
  &?BLOCK.say;
}

when ?True {
  &?BLOCK.say;
}

คำตอบ:


6

ครั้งแรกของทั้งหมด: .sayไม่ไม่ให้ค่าตัวตนเพราะที่เรียก.gistวิธีการแสดงออกที่กำหนด สำหรับค่าตัวตนคุณต้องเรียก.WHICHวิธีการ โชคดีที่Block.gistวิธีการนี้รวมถึงค่าตัวตนในการทำให้เป็นสตริง แต่ไม่รับประกันว่าจะเป็นกรณีสำหรับวัตถุทั้งหมด

สิ่งที่คุณเห็นคือเครื่องมือเพิ่มประสิทธิภาพแบบสแตติกในที่ทำงาน: เนื่องจากไม่มีสิ่งใดเกิดขึ้นภายในบล็อกจึงสามารถละทิ้งได้ ในกรณีที่มันแตกต่างกัน (ที่คุณระบุลายเซ็นสำรอง) จะแตกต่างกัน หากคุณเรียกใช้สคริปต์นี้ด้วย--optimize=0หรือ--optimize=1บล็อกทั้งหมดจะมีค่าตัวตนที่แตกต่างกัน

ฉันเดาว่าคุณสามารถเรียกได้ว่าเป็นปัญหาที่กล่าวถึง&?BLOCKไม่ได้ขัดขวางเครื่องมือเพิ่มประสิทธิภาพแบบคงที่จากการทำให้ขอบเขตแบนราบ ในทางกลับกันคุณอาจเรียกกรณีนี้ว่า DIHWIDT (หมอมันเจ็บเมื่อฉันทำสิ่งนี้) ดังนั้นอย่าทำอย่างนั้น :-)

ปรับปรุง: มันเป็นลายเซ็นที่แตกต่างที่สร้างความแตกต่าง Daniel Mita ++


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