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

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

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

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