การแคชอาร์กิวเมนต์บล็อกค่า

บางครั้งเครื่องมือสร้างโค้ดบล็อกอาจต้องอ้างอิงโค้ดภายใน บล็อกหลายครั้ง

ตัวอย่างเช่น หากคุณมีบล็อกที่ได้รับองค์ประกอบสุดท้ายของรายการ คุณต้องมี เพื่อเข้าถึงรหัสรายการหลายครั้ง

// 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