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