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.