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

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

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

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