वैल्यू ब्लॉक आर्ग्युमेंट कैश मेमोरी

कभी-कभी आपके ब्लॉक-कोड जनरेटर को कई बार अपने अंदरूनी ब्लॉक के कोड का रेफ़रंस देने की ज़रूरत होती है.

उदाहरण के लिए, अगर आपके पास ऐसा ब्लॉक है जिसे सूची का आखिरी एलिमेंट दिखता है, तो आपको सूची कोड को कई बार ऐक्सेस करना होगा:

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

हालांकि, अगर अंदरूनी ब्लॉक के कोड की वैल्यू अलग-अलग होती है या उसके खराब असर होते हैं, तो समस्या हो सकती है. उदाहरण के लिए, अगर अंदरूनी कोड असल में एक फ़ंक्शन कॉल है, तो यह कोड रेंज से बाहर हो सकता है:

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

यूटिलिटी फ़ंक्शन का इस्तेमाल करके, यह पक्का किया जा सकता है कि इनर ब्लॉक के कोड का आकलन सिर्फ़ एक बार किया जाए.

यूटिलिटी फ़ंक्शन

यूटिलिटी फ़ंक्शन, डेवलपर का तय किया गया फ़ंक्शन होता है. इसे जनरेट किए गए कोड स्ट्रिंग के हिस्से के तौर पर शामिल किया जाता है. इनका इस्तेमाल यह पक्का करने के लिए किया जा सकता है कि इनर-ब्लॉक कोड का सिर्फ़ एक बार आकलन किया गया हो. इसके बाद, वैल्यू का कई बार रेफ़रंस दिया जा सकता है.

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

फ़ंक्शन उपलब्ध कराएं

provideFunction_ का इस्तेमाल करके, ब्लॉक-कोड जनरेटर के अंदर यूटिलिटी फ़ंक्शन तय किए जा सकते हैं. इसमें वह नाम होता है जो आपको यूटिलिटी फ़ंक्शन के लिए चाहिए. साथ ही, कोड स्ट्रिंग की एक कैटगरी भी बताती है कि फ़ंक्शन क्या करता है. यह बदलाव करने के बाद आपके यूटिलिटी फ़ंक्शन का नाम दिखाता है, ताकि उपयोगकर्ता के तय किए गए फ़ंक्शन में कोई समस्या न हो.

provideFunction_, यूटिलिटी फ़ंक्शन की परिभाषाओं को भी डुप्लीकेट करता है, ताकि हर यूटिलिटी फ़ंक्शन सिर्फ़ एक बार मौजूद हो. भले ही, उसे तय करने वाला ब्लॉक टाइप कई बार मौजूद हो.

प्राथमिकता अपडेट करें

जब आप यूटिलिटी फ़ंक्शन तय करते हैं, तो आपको ब्लॉक-कोड जनरेटर में शामिल प्राथमिकताओं (जो तय करते हैं कि पैरेंथेस को कैसे शामिल किया जाता है) को भी अपडेट करना चाहिए.

प्राथमिकता हमेशा ब्लॉक-कोड जनरेटर से मिली कोड स्ट्रिंग पर आधारित होती है. यह यूटिलिटी फ़ंक्शन में ऑपरेटर की परवाह नहीं करता. इसलिए, पिछले उदाहरण में, valueToCode कॉल को Order.NONE में बदला गया और रिटर्न टपल को Order.FUNCTION_CALL में बदला गया.