Cache argumen blok nilai

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.