值區塊引數快取

有時候,區塊程式碼產生器需要參照其內部程式碼 反覆封鎖

舉例來說,如果您的區塊會取得清單的最後一個元素,您就必須 多次存取清單程式碼:

// 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,而 return 元組已變更為 Order.FUNCTION_CALL