Caching von Wertblockargumenten

Manchmal muss Ihr Blockcode-Generator auf den Code des inneren mehrere Male blockiert werden.

Wenn Sie beispielsweise einen Block haben, der das letzte Element einer Liste erhält, müssen Sie um mehrfach auf den Listencode zuzugreifen:

// 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];
}

Dies kann jedoch zu Problemen führen, wenn der resultierende Wert des Codes des inneren Blocks oder Nebenwirkungen haben. Wenn der innere Code beispielsweise Funktionsaufruf verwendet wird, kann dieser Code am Ende zu einer Bedingung außerhalb des zulässigen Bereichs führen:

randomList()[randomList().length - 1]

Mit Dienstfunktionen können Sie sicherstellen, Code ist nur einmal ausgewertet.

Hilfsfunktionen

Eine Dienstprogrammfunktion ist eine vom Entwickler definierte Funktion, die im generierter Code-String. Sie können sie verwenden, um sicherzustellen, dass der Code für den inneren Block wird nur einmal bewertet, woraufhin der Wert mehrfach referenziert werden kann.

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];
}

Funktion angeben

Sie können Dienstfunktionen in Blockcode-Generatoren mit provideFunction_ Dabei wird der gewünschte Name für die Dienstfunktion verwendet. Ein Array von Codezeichenfolgen, mit denen die Funktion der Funktion definiert wird. Sie gibt den Fehlerwert Ergebnis des Namens Ihrer Dienstprogrammfunktion, nachdem sie (möglicherweise) so geändert wurde, dass Konflikt mit benutzerdefinierten Funktionen.

provideFunction_ dedupliziert auch Dienstfunktionsdefinitionen, sodass jede Dienstprogrammfunktion nur einmal vorhanden ist, auch wenn der Blocktyp, der sie definiert, existiert. und zwar mehrmals.

Rangfolge aktualisieren

Wenn Sie eine Dienstfunktion definieren, sollten Sie auch die Rangfolge aktualisieren. die definieren, wie Klammern eingefügt werden. Blockcode-Generator zu erstellen.

Die Rangfolge basiert immer auf dem Codestring, der vom Blockcode zurückgegeben wird. Generator. Operatoren in Dienstprogrammfunktionen sind dabei nicht relevant. In der Im vorherigen Beispiel wurde der valueToCode-Aufruf in Order.NONE geändert und der Tupel für die Rückgabe wurde in Order.FUNCTION_CALL geändert.