Bazen blok kodu oluşturucunuzun dahili koduna başvurması gerekir. engelleyebilirsiniz.
Örneğin, listenin son öğesini alan bir blokunuz varsa birden çok kez açabilirsiniz:
// 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];
}
Ancak iç blokun kodunun ortaya çıkan değeri veya yan etkileri vardır. Örneğin, iç kod gerçekten işlev çağrısında bulunduğunda, bu kod, aralık dışında bir koşulla sonuçlanabilir:
randomList()[randomList().length - 1]
Yardımcı fonksiyonları kullanmak iç blokların kod yalnızca bir kez değerlendirilmiştir.
Yardımcı işlevler
Yardımcı program işlevi, oluşturulmuş kod dizesini içerir. İç blok kodunun daha uygun olduğundan emin olmak için yalnızca bir kez değerlendirilir, ardından değere birden çok kez referansta bulunulabilir.
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];
}
İşlevi sağlayın
Blok kodu oluşturucularının içindeki yardımcı işlev fonksiyonlarını tanımlamak için
provideFunction_
Yardımcı program işleviniz için istediğiniz adı alır ve
fonksiyonun ne yaptığını tanımlayan bir kod dizeleri dizisi. Şunu döndürür:
(muhtemelen)
ve kullanıcı tanımlı işlevlerle çakışır.
provideFunction_
, yardımcı program işlevi tanımlarını da tekilleştirir. Böylece her bir
yardımcı program işlevi, onu tanımlayan blok türü mevcut olsa bile yalnızca bir kez mevcuttur
birden fazla kez.
Güncelleme öncelikleri
Bir yardımcı program işlevi tanımladığınızda, bu işlevlerin önceliklerini de güncellemeniz gerekir. (parantezlerin nasıl eklendiğini tanımlar) blok kodu oluşturma aracı.
Öncelik her zaman blok kodunun döndürdüğü kod dizesine bağlıdır
oluşturabilirsiniz. Yardımcı program işlevlerindeki operatörlerle ilgilenmez. Bu nedenle
önceki örnekte valueToCode
çağrısı Order.NONE
olarak,
dönüş demeti Order.FUNCTION_CALL
olarak değiştirildi.