การบล็อกหมายถึงวงเล็บ ตัวอย่างเช่น เมื่อเห็นการบล็อกต่อไปนี้
สมมติว่าหมายความว่า -(5 + 2)
ไม่ใช่ -5 + 2
เพราะ 5
และ 2
เป็นส่วนหนึ่งของ
1 บล็อก และ -
เป็นส่วนหนึ่งของอีกบล็อกหนึ่ง
แต่ถ้าคุณใส่วงเล็บไว้ข้างบล็อกทุกบล็อก ก็จะทำให้โค้ดลดลงมาก
สามารถอ่านได้ เปรียบเทียบ (((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
มีลำดับความสำคัญสูงสุด ซึ่งจะใช้ในกรณีต่อไปนี้
- คุณต้องทำให้โค้ดอยู่ในวงเล็บเสมอ
คุณจึงส่งไปให้
valueToCode
- บล็อกของคุณไม่มีโอเปอเรเตอร์ใดๆ คุณจึงส่งคืนจาก โปรแกรมสร้างโค้ดบล็อก
Order.NONE
เป็นลำดับความสำคัญที่อ่อนที่สุด ซึ่งจะใช้ในกรณีต่อไปนี้
- คุณต้องทำให้โค้ดอยู่ในวงเล็บเสมอ เพื่อให้คุณส่งคืนจากโปรแกรมสร้างโค้ดบล็อก
- ไม่มีโอเปอเรเตอร์ที่มีผลกับบล็อกภายใน ดังนั้นคุณส่งต่อไปยัง
valueToCode