การใส่วงเล็บ

การบล็อกหมายถึงวงเล็บ ตัวอย่างเช่น เมื่อเห็นการบล็อกต่อไปนี้ สมมติว่าหมายความว่า -(5 + 2) ไม่ใช่ -5 + 2 เพราะ 5 และ 2 เป็นส่วนหนึ่งของ 1 บล็อก และ - เป็นส่วนหนึ่งของอีกบล็อกหนึ่ง

บล็อกที่แสดงถึง -(5 + 2)

แต่ถ้าคุณใส่วงเล็บไว้ข้างบล็อกทุกบล็อก ก็จะทำให้โค้ดลดลงมาก สามารถอ่านได้ เปรียบเทียบ (((5) * (2)) + (3)) กับ 5 * 2 + 3 ทั้ง 2 อย่างนี้ นิพจน์ประเมินจากสิ่งเดียวกัน (13) แต่นิพจน์ที่ 2 ทำได้ง่ายกว่ามาก สำหรับการอ่าน

กฎลำดับความสำคัญของโอเปอเรเตอร์ของ Blockly จะช่วยคุณสร้างโค้ดที่มี จำนวนวงเล็บ เพื่อให้อ่านได้ง่ายที่สุด

สร้างข้อมูลที่ "ถูกต้อง" เอาต์พุต

หากคุณไม่ต้องการให้โค้ดที่สร้างขึ้นต้องเป็นโค้ดที่มนุษย์อ่านได้ คุณไม่จำเป็นต้อง ที่ต้องกังวลเกี่ยวกับย่อวงเล็บ การใช้ตัวเลือกรวมทุกบล็อกเป็นวิธีที่ดี และโค้ดที่สร้างขึ้นจะได้รับการประเมินอย่างถูกต้องเสมอ

เพื่อความถูกต้อง โปรดส่งการโทร Order.ATOMIC ไปยัง valueToCode เสมอ และ แสดงผล Order.NONE จากโปรแกรมสร้างโค้ดบล็อกเสมอ

สร้างวงเล็บที่เหมาะสม

ต้องแทรกวงเล็บเฉพาะในกรณีที่โค้ดที่สร้างขึ้นไม่ถูกต้อง ให้พวกเขา กรณีนี้จะเกิดขึ้นเมื่อลำดับความสำคัญของโอเปอเรเตอร์ในบล็อกด้านนอกคือ สูงกว่าลำดับความสำคัญของโอเปอเรเตอร์ในบล็อกด้านใน

เช่น ในบล็อกต่อไปนี้จะมีโอเปอเรเตอร์นิเสธแบบเอกภาคและ โอเปอเรเตอร์การเพิ่ม นิเสธแบบเอกภาคมีความสำคัญมากกว่า โอเปอเรเตอร์การเพิ่ม

การแทนที่และการเพิ่ม

ดังนั้นหากไม่เพิ่มวงเล็บ คุณจะได้รับ -5 + 2 และ - จะได้รับการประเมิน ก่อน + ซึ่งไม่ตรงกับการบล็อก

คุณบอกเครื่องมือสร้างว่าจะแทรกวงเล็บได้เมื่อใดโดยการบอกระดับความแรงของสัญญาณ โอเปอเรเตอร์ที่ต่างกัน หากเห็นว่าโอเปอเรเตอร์ด้านนอกแรงกว่า โอเปอเรเตอร์ภายในจะแทรกวงเล็บเพื่อปกป้องโอเปอเรเตอร์ภายใน

valueToCode มีลำดับความสำคัญสูงกว่าโอเปอเรเตอร์ภายนอก และการส่งคืน tuple จะระบุลำดับความสำคัญของโอเปอเรเตอร์ภายใน

ต่อไปนี้คือตัวอย่างการบล็อกที่มีโอเปอเรเตอร์ 2 รายการ

บล็อกที่มีโอเปอเรเตอร์นิเสธแบบเอกภาคและโอเปอเรเตอร์การเพิ่ม และองค์ประกอบย่อย
บล็อก

import {javascriptGenerator, Order} from 'blockly/javascript';

javascriptGenerator.forBlock['negate_plus_two'] = function(block, generator) {
  // valueToCode takes in the precedence of the outer operator.
  const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
  const code = `-${innerCode} + 2`;
  // The return tuple specifies the precedence of the inner operator.
  return [code, Order.ADDITION];
}

ลำดับความสำคัญของ valueToCode

เมื่อคุณเรียกใช้ valueToCode เพื่อสร้างโค้ดของบล็อกภายใน คุณจะได้รับการส่งต่อรหัส ลำดับความสำคัญของโอเปอเรเตอร์ที่มีประสิทธิภาพที่สุดที่ดำเนินการกับโค้ดภายใน บล็อก นี่คือโอเปอเรเตอร์ที่โค้ดของบล็อกภายในที่ต้องได้รับการป้องกัน

ตัวอย่างเช่น แท็กต่อไปนี้บล็อกทั้งโอเปอเรเตอร์นิเสธแบบเอกภาคและโอเปอเรเตอร์ นอกจากนี้ โอเปอเรเตอร์ยังจะทำงานกับโค้ดของบล็อกภายใน นิเสธแบบเอกภาค รัดกุมกว่า ดังนั้นคุณควรส่งไปยัง valueToCode เป็นอันดับแรก

บล็อกที่มีโอเปอเรเตอร์นิเสธแบบเอกภาคและโอเปอเรเตอร์การเพิ่ม และองค์ประกอบย่อย
บล็อก

// The - is the strongest operator acting on the inner code.
const innerCode = generator.valueToCode(block, 'INNER', Order.UNARY_NEGATION);
const code = `-${innerCode} + 2`;

ลำดับความสำคัญในการคืนสินค้า

เมื่อคุณแสดงผลลำดับความสำคัญจากโปรแกรมสร้างโค้ดบล็อก ให้แสดงผล ลำดับความสำคัญของโอเปอเรเตอร์ที่อ่อนที่สุดภายในโค้ดของบล็อก นี่คือ ที่ต้องการการปกป้อง

ตัวอย่างเช่น บล็อกต่อไปนี้มีทั้งโอเปอเรเตอร์นิเสธแบบเอกภาคและโอเปอเรเตอร์ โอเปอเรเตอร์การเพิ่ม จำนวนที่เพิ่มเข้ามาจะมีประสิทธิภาพน้อยกว่า ดังนั้นคุณควร จากโปรแกรมสร้างโค้ดบล็อก

บล็อกที่มีโอเปอเรเตอร์นิเสธแบบเอกภาคและโอเปอเรเตอร์การเพิ่ม และไม่มีโอเปอเรเตอร์ย่อย
บล็อก

const code = `-${innerCode} + 2`;
// The + is the weakest operator in the block.
return [code, Order.ADDITION];

เรียงลำดับ Enum

โมดูลโปรแกรมสร้างภาษาทุกโมดูลจะกำหนด enum Order ซึ่งรวมทุก ลำดับความสำคัญสำหรับภาษานั้น

ลำดับความสำคัญที่มากกว่าจะมีค่าสำรองต่ำกว่า และลำดับความสำคัญที่ต่ำกว่า ที่สูงขึ้น คุณสามารถนึกถึงลำดับความสำคัญที่ชัดเจนว่าเป็นการ "ถูกจัดอันดับ" สูงขึ้น" และจุดอ่อนกว่า และมี "อันดับต่ำกว่า" - ราวกับว่า เป็นนักสู้

คุณสามารถดู Enum Order สำหรับภาษาในตัวทั้งหมดได้ที่นี่

ลำดับความสำคัญพิเศษ

สิ่งสำคัญที่สุดในเครื่องมือสร้าง enum ของ Order ตรงกับลำดับความสำคัญ ตามภาษาที่ใช้ข้อความที่เกี่ยวข้อง แต่มีพิเศษอยู่ 2 อย่าง ลำดับความสำคัญ Order.ATOMIC และ Order.NONE

Order.ATOMIC มีลำดับความสำคัญสูงสุด ซึ่งจะใช้ในกรณีต่อไปนี้

Order.NONE เป็นลำดับความสำคัญที่อ่อนที่สุด ซึ่งจะใช้ในกรณีต่อไปนี้

  • คุณต้องทำให้โค้ดอยู่ในวงเล็บเสมอ เพื่อให้คุณส่งคืนจากโปรแกรมสร้างโค้ดบล็อก
  • ไม่มีโอเปอเรเตอร์ที่มีผลกับบล็อกภายใน ดังนั้นคุณส่งต่อไปยัง valueToCode