Değer bloğu bağımsız değişkenini önbelleğe alma

Bazen blok kodu oluşturucunuzun dahili koduna başvurması gerekir. engelleyebilirsiniz.

Örneğin, listenin son öğesini alan bir blokunuz varsa birden çok kez açabilirsiniz:

// 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];
}

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:

randomList()[randomList().length - 1]

Yardımcı fonksiyonları kullanmak iç blokların kod yalnızca bir kez değerlendirilmiştir.

Yardımcı işlevler

Yardımcı program işlevi, oluşturulmuş kod dizesini içerir. İç blok kodunun daha uygun olduğundan emin olmak için yalnızca bir kez değerlendirilir, ardından değere birden çok kez referansta bulunulabilir.

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];
}

İşlevi sağlayın

Blok kodu oluşturucularının içindeki yardımcı işlev fonksiyonlarını tanımlamak için provideFunction_ Yardımcı program işleviniz için istediğiniz adı alır ve fonksiyonun ne yaptığını tanımlayan bir kod dizeleri dizisi. Şunu döndürür: (muhtemelen) ve kullanıcı tanımlı işlevlerle çakışır.

provideFunction_, yardımcı program işlevi tanımlarını da tekilleştirir. Böylece her bir yardımcı program işlevi, onu tanımlayan blok türü mevcut olsa bile yalnızca bir kez mevcuttur birden fazla kez.

Güncelleme öncelikleri

Bir yardımcı program işlevi tanımladığınızda, bu işlevlerin önceliklerini de güncellemeniz gerekir. (parantezlerin nasıl eklendiğini tanımlar) blok kodu oluşturma aracı.

Öncelik her zaman blok kodunun döndürdüğü kod dizesine bağlıdır oluşturabilirsiniz. Yardımcı program işlevlerindeki operatörlerle ilgilenmez. Bu nedenle önceki örnekte valueToCode çağrısı Order.NONE olarak, dönüş demeti Order.FUNCTION_CALL olarak değiştirildi.