Cache argumen blok nilai

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.