Terkadang generator kode blok Anda perlu merujuk kode blok dalamnya beberapa kali.
Misalnya, jika Anda memiliki blok yang mendapatkan elemen terakhir dari sebuah daftar, Anda perlu 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];
}
Namun, hal ini dapat menyebabkan masalah jika nilai yang dihasilkan dari kode blok dalam tidak konsisten, atau memiliki efek samping. Misalnya, jika kode dalam sebenarnya adalah panggilan fungsi, kode khusus ini dapat berakhir dengan kondisi di luar rentang:
randomList()[randomList().length - 1]
Penggunaan fungsi utilitas memungkinkan Anda memastikan bahwa kode blok dalam hanya dievaluasi sekali.
Fungsi utilitas
Fungsi utilitas adalah fungsi yang ditentukan developer dan disertakan sebagai bagian dari string kode yang dihasilkan. Anda dapat menggunakannya untuk memastikan bahwa kode blok dalam hanya dievaluasi satu kali, lalu nilai dapat direferensikan 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];
}
Berikan fungsi
Anda dapat menentukan fungsi utilitas di dalam generator kode blok menggunakan
provideFunction_
. Fungsi ini memerlukan nama yang Anda inginkan untuk fungsi utilitas Anda, dan array string kode yang menentukan fungsi fungsi tersebut. Metode ini akan menampilkan nama fungsi utilitas yang dihasilkan, setelah (mungkin) mengubahnya agar tidak bertentangan dengan fungsi yang ditentukan pengguna.
provideFunction_
juga menghapus duplikat definisi fungsi utilitas, sehingga setiap
fungsi utilitas hanya ada satu kali, meskipun jenis blok yang menentukannya ada
beberapa kali.
Memperbarui prioritas
Saat menentukan fungsi utilitas, Anda juga harus memperbarui prioritas (yang menentukan cara tanda kurung disisipkan) yang disertakan dalam generator kode blok.
Prioritas selalu didasarkan pada string kode yang ditampilkan oleh generator kode blok. Ia tidak peduli dengan operator di dalam fungsi utilitas. Jadi, pada
contoh sebelumnya, panggilan valueToCode
diubah menjadi Order.NONE
dan
tuple yang ditampilkan diubah menjadi Order.FUNCTION_CALL
.