कभी-कभी आपके ब्लॉक-कोड जनरेटर को अपने अंदरूनी कई बार ब्लॉक करना.
उदाहरण के लिए, अगर आपके पास ऐसा ब्लॉक है जिसे सूची का आखिरी एलिमेंट मिलता है, तो आपको सूची कोड को कई बार ऐक्सेस करने के लिए:
// 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
में बदल दिया गया.