บางครั้งเครื่องมือสร้างโค้ดบล็อกอาจต้องอ้างอิงโค้ดภายใน บล็อกหลายครั้ง
ตัวอย่างเช่น หากคุณมีบล็อกที่ได้รับองค์ประกอบสุดท้ายของรายการ คุณต้องมี เพื่อเข้าถึงรหัสรายการหลายครั้ง
// Incorrect block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);
// listCode gets referenced twice.
const code = `${listCode}[${listCode}.length - 1]`;
return [code, Order.MEMBER];
}
แต่ก็อาจทำให้เกิดปัญหาได้ถ้าค่าที่ได้จากโค้ดของบล็อกภายในคือ ไม่สอดคล้องกัน หรือมีผลข้างเคียง ตัวอย่างเช่น หากโค้ดภายในจริงๆ แล้ว การเรียกใช้ฟังก์ชัน โค้ดเฉพาะนี้อาจมีเงื่อนไขอยู่นอกช่วงดังนี้
randomList()[randomList().length - 1]
การใช้ฟังก์ชันยูทิลิตีจะช่วยให้มั่นใจว่าบล็อกภายใน เท่านั้น ประเมินเพียงครั้งเดียว
ฟังก์ชันยูทิลิตี
ฟังก์ชันยูทิลิตีคือฟังก์ชันที่นักพัฒนาซอฟต์แวร์กำหนด ซึ่งเป็นส่วนหนึ่งของ สตริงโค้ดที่สร้างขึ้น คุณสามารถใช้คำสั่งเหล่านี้เพื่อตรวจสอบว่าโค้ดบล็อกภายใน ได้รับการประเมินเพียงครั้งเดียวเท่านั้น จากนั้นอาจมีการอ้างอิงค่าได้หลายครั้ง
import {javascriptGenerator, Order} from 'blockly/javascript';
// Correct block-code generator.
javascriptGenerator.forBlock['last_element'] = function(block, generator) {
const listCode = generator.valueToCode(block, 'LIST', Order.NONE);
const functionName = generator.provideFunction_(
'list_lastElement',
[
`function ${generator.FUNCTION_NAME_PLACEHOLDER_}(list) {`,
` return list[list.length - 1];`,
`}`
]
);
// listCode only gets evaluated once.
const code = `${functionName}(${listCode})`;
return [code, Order.FUNCTION_CALL];
}
ระบุฟังก์ชัน
คุณสามารถกำหนดฟังก์ชันยูทิลิตีภายในเครื่องมือสร้างบล็อกโค้ดได้โดยใช้
provideFunction_
ซึ่งจะใช้ชื่อที่คุณต้องการสำหรับฟังก์ชันด้านสาธารณูปโภค และ
อาร์เรย์ของสตริงโค้ดที่กำหนดหน้าที่ของฟังก์ชันนี้ โดยจะแสดง
ผลลัพธ์ของฟังก์ชันยูทิลิตีของคุณ หลังจาก (อาจ) แก้ไขเป็น
ขัดแย้งกับฟังก์ชันที่กำหนดโดยผู้ใช้
provideFunction_
ยังลบล้างนิยามฟังก์ชันยูทิลิตีด้วย เพื่อให้ค่า
ฟังก์ชันยูทิลิตีจะมีอยู่เพียงครั้งเดียว แม้ว่าจะมีประเภทการบล็อกที่กำหนดว่าฟังก์ชันนั้นมีอยู่ก็ตาม
หลายครั้ง
อัปเดตลำดับความสำคัญ
เมื่อคุณกำหนดฟังก์ชันยูทิลิตี คุณควรอัปเดตลำดับความสำคัญด้วย (ซึ่งกำหนดวิธีแทรกวงเล็บ) ที่รวมอยู่ในแท็ก โปรแกรมสร้างโค้ดบล็อก
ลำดับความสำคัญจะขึ้นอยู่กับสตริงโค้ดที่โค้ดบล็อกแสดงผลเสมอ
โปรแกรมสร้าง โดยไม่สนใจโอเปอเรเตอร์ภายในฟังก์ชันยูทิลิตี ดังนั้นในส่วน
ตัวอย่างก่อนหน้านี้ การเรียก valueToCode
เปลี่ยนเป็น Order.NONE
และ
เปลี่ยน Tuple กลับเป็น Order.FUNCTION_CALL