التخزين المؤقت لوسيطة مجموعة القيمة

في بعض الأحيان، يحتاج منشئ رمز الحظر إلى الإشارة إلى الرمز الخاص به الحظر عدة مرات.

على سبيل المثال، إذا كان لديك كتلة تحصل على العنصر الأخير في القائمة، فأنت بحاجة إلى للوصول إلى رمز القائمة عدة مرات:

// 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.