Bazen blok kodu oluşturucunuzun dahili koduna başvurması gerekir. engelleyebilirsiniz.
Örneğin, bir listenin son öğesini yazdıran bir blokunuz varsa liste koduna birden çok kez erişmeniz gerekir:
// Incorrect block-code generator.
javascriptGenerator.forBlock['print_last_element'] = function(block, generator) {
const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);
// listCode gets referenced twice.
return `print(${listCode}[${listCode}.length - 1]);\n`;
}
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:
print(randomList()[randomList().length - 1]);
Geçici değişkenlere atamak, iç bloğun kodunun yalnızca bir kez değerlendirilir.
Geçici değişkenler
Geçici değişkenler, iç blokun kod dizesinin değerini depolar. Böylece, kod yalnızca bir kez değerlendirilir ve daha sonra değere birden çok referans verilebilir kez.
import {javascriptGenerator, Order} from 'blockly/javascript';
// Correct block-code generator.
javascriptGenerator.forBlock['print_last_element'] = function(block, generator) {
const listCode = generator.valueToCode(block, 'LIST', Order.MEMBER);
const listVar = generator.nameDB_.getDistinctName(
'temp_list', Blockly.names.NameType.VARIABLE);
// listCode only gets evaluated once.
const code = `var ${listVar} = ${listCode};\n`;
return `print(${listVar}[${listVar}.length - 1]);\n`;
}
getDistinctName
çağrısı, istediğiniz değişken adını alır ve şunu döndürür:
çakışmayan bir ad kullanın.
Gereksiz kodu azaltın
Geçici değişkenlerin olumsuz tarafı, iç bloğun kodu bir bir kod yazmazsanız gereksiz olan bir kod alırsınız:
// Assigning to temp_list is unnecessary.
var temp_list = foo;
print(temp_list[temp_list.length - 1]);
Daha net bir kod üretmek için iç blok kodunun bir değer olup olmadığını ve geçici değişkeni dahil edin.
if (listCode.match(/^\w+$/)) {
const code = `print(${listCode}[${listCode}.length - 1]);\n`;
} else {
const listVar = generator.nameDB_.getDistinctName(
'temp_list', Blockly.names.NameType.VARIABLE);
const code = `var ${listVar} = ${listCode};\n`;
code += `print(${listVar}[${listVar}.length - 1]);\n`;
}