Terkadang generator kode blok Anda perlu mereferensikan kode di bagian dalamnya beberapa kali.
Misalnya, jika Anda memiliki blok yang mendapatkan elemen terakhir dari daftar, Anda harus untuk mengakses kode daftar beberapa kali:
// 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];
}
Tapi ini dapat menyebabkan masalah jika nilai dari kode blok bagian dalam yang dihasilkan tidak konsisten, atau memiliki efek samping. Misalnya, jika kode {i>inner<i} sebenarnya panggilan fungsi, kode khusus ini dapat berakhir dengan kondisi di luar rentang:
randomList()[randomList().length - 1]
Menggunakan fungsi utilitas memungkinkan Anda memastikan bahwa blok {i>inner<i} kode hanya dievaluasi sekali.
Fungsi utilitas
Fungsi utilitas adalah fungsi yang didefinisikan pengembang yang tercakup sebagai bagian dari string kode yang dihasilkan. Anda dapat menggunakannya untuk memastikan bahwa kode {i>inner-block<i} hanya dievaluasi sekali, lalu nilainya dapat dirujuk beberapa kali.
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];
}
Menyediakan fungsi
Anda dapat menentukan fungsi utilitas di dalam generator {i>block-code<i} menggunakan
provideFunction_
. Dibutuhkan nama yang Anda inginkan untuk fungsi utilitas Anda, dan
sebuah larik {i>string<i} kode yang mendefinisikan
apa yang dilakukan fungsi tersebut. Metode ini mengembalikan
nama yang dihasilkan dari fungsi utilitas, setelah (mungkin) mengubahnya menjadi
konflik dengan fungsi yang ditentukan pengguna.
provideFunction_
juga menghapus duplikat definisi fungsi utilitas, sehingga setiap
fungsi utilitas hanya ada sekali, bahkan jika ada jenis blok yang menentukannya
beberapa kali.
Memperbarui prioritas
Saat menentukan fungsi utilitas, Anda juga harus memperbarui prioritas (yang menentukan cara memasukkan tanda kurung) ke dalam pembuat kode blok.
Prioritas selalu didasarkan pada string kode yang ditampilkan oleh kode blok
web. Fungsi ini tidak peduli dengan operator di dalam fungsi utilitas. Pada
contoh sebelumnya, panggilan valueToCode
diubah menjadi Order.NONE
dan
return tuple diubah menjadi Order.FUNCTION_CALL
.