المتغيرات

المتغيرات هي مفهوم برمجة مهم. يتوافق بشكل الحظر مع اللغات المكتوبة ديناميكيًا مثل Python وJavaScript، ومع بذل مجهود إضافي، يمكنك إضافة معلومات لإتاحة اللغات المكتوبة بكثرة (أو اللغات المكتوبة بالكتابة الثابتة) مثل Java أو C.

يمكنك الاطّلاع هنا على مزيد من المعلومات حول اللغات المكتوبة بنمط حركة البيانات الديناميكية والثابتة.

يوفر بشكل حظر حقول متغيرة وهي مربعات قائمة منسدلة ديناميكية تعرض أسماء المتغيرات التي قدمها المستخدم. فيما يلي مثال على واحدة.

بشكل تلقائي، يسمح بشكل تلقائي بتخصيص أي نوع لمتغيّر، وجميع أدوات الإنشاء التي يوفّرها Bluetoothly مخصصة للّغات المكتوبة ديناميكيًا. إذا كنت تستخدم لغة مكتوبة بدلاً من ذلك، يمكنك ضبط حظر المحتوى لإتاحة هذه اللغة من خلال اتّباع الخطوات التالية:

قوالب متغيرة غير مكتوبة

الكتل البرمجية الأساسية للوصول إلى متغير ومعالجتها هي كتلة getter وsetter. لنتعرّف على الكتل البرمجية اللغوية والتربيعية التي يوفرها تطبيق Blockly.

JSON

// Block for variable getter.
{
  "type": "variables_get",
  "message0": "%1",
  "args0": [
    {    // Beginning of the field variable dropdown
      "type": "field_variable",
      "name": "VAR",    // Static name of the field
      "variable": "%{BKY_VARIABLES_DEFAULT_NAME}"    // Given at runtime
    }    // End of the field variable dropdown
  ],
  "output": null,    // Null means the return value can be of any type
  ...
},

// Block for variable setter.
{
  "type": "variables_set",
  "message0": "%{BKY_VARIABLES_SET}",
  "args0": [
    {
      "type": "field_variable",
      "name": "VAR",
      "variable": "%{BKY_VARIABLES_DEFAULT_NAME}"
    },
    {
      "type": "input_value",    // This expects an input of any type
      "name": "VALUE"
    }
  ],
  ...
}

JavaScript

// Block for variable getter.
Blockly.Blocks['variables_get'] = {
  init: function() {
    this.appendDummyInput()
      .appendField(new Blockly.FieldVariable("VAR_NAME"), "FIELD_NAME");
    this.setOutput(true, null);
    ...
  }
};

// Block for variable setter.
Blockly.Blocks['variables_set'] = {
  init: function() {
    this.appendValueInput("NAME")
        .setCheck(null)
        .appendField("set")
        .appendField(new Blockly.FieldVariable("VAR_NAME"), "FIELD_NAME")
        .appendField("to");
    this.setOutput(true, null);
    ...
  }
};

يؤدّي ذلك إلى إنشاء الكتلتَين التاليتَين:

تفصيل مهم يجب ملاحظته هو أنه عن طريق تعيين "output" للمتغير getter على قيمة خالية، يمكن أن تكون القيمة المعروضة من أي نوع. لاحظ أيضًا أن إدخال المتغير setter لا يحدد أي عمليات تحقق. نتيجة لذلك، يمكن تعيين المتغير على أي نوع من القيم.

قوالب المتغيّرات المكتوبة

يمكنك إضافة رموز الإحضار والقيم التي تفرض التحقق من النوع. على سبيل المثال، إذا قمت بإنشاء متغير من النوع "Panda"، فإن التعريفات التالية تنشئ دالة getter وsetter بالأنواع المناسبة.

JSON

 // Block for Panda variable getter.
 {
  "type": "variables_get_panda",
  "message0": "%1",
  "args0": [
    {
      "type": "field_variable",
      "name": "VAR",
      "variable": "%{BKY_VARIABLES_DEFAULT_NAME}",
      "variableTypes": ["Panda"],    // Specifies what types to put in the dropdown
      "defaultType": "Panda"
    }
  ],
  "output": "Panda",    // Returns a value of "Panda"
  ...
},

 // Block for Panda variable setter.
{
  "type": "variables_set_panda",
  "message0": "%{BKY_VARIABLES_SET}",
  "args0": [
    {
      "type": "field_variable",
      "name": "VAR",
      "variable": "%{BKY_VARIABLES_DEFAULT_NAME}",
      "variableTypes": ["Panda"],
      "defaultType": "Panda"
    },
    {
      "type": "input_value",
      "name": "VALUE",
      "check": "Panda"    // Checks that the input value is of type "Panda"
    }
  ],
  "previousStatement": null,
  "nextStatement": null,
  ...
}

JavaScript

// Block for variable getter.
Blockly.Blocks['variables_get_panda'] = {
  init: function() {
    this.appendDummyInput()
      .appendField(new Blockly.FieldVariable(
          "VAR_NAME", ['Panda'], 'Panda'), "FIELD_NAME");
    this.setOutput(true, 'Panda');
    ...
  }
};

// Block for variable setter.
Blockly.Blocks['variables_set_panda'] = {
  init: function() {
    this.appendValueInput("NAME")
        .setCheck('Panda')
        .appendField("set")
        .appendField(new Blockly.FieldVariable(
            "VAR_NAME", null, ['Panda'], 'Panda'), "FIELD_NAME")
        .appendField("to");
        this.setPreviousStatement(true, null);
        this.setNextStatement(true, null);
    ...
  }
};

يؤدي هذا إلى إنشاء نوعين من الكتل، وهما getter وsetter. تعرض قوائمهم المنسدلة فقط متغيرات من نوع Panda. لا تقبل مدخلاتها ومخرجاتها إلا الروابط من النوع Panda. يجب ضبط defaultType للحقل على إحدى القيم في صفيف variableTypes. في حال عدم ضبط defaultType أثناء توفير مصفوفة variableTypes، سيظهر خطأ.

بشكل افتراضي لا يوجد مؤشر مرئي لإعلام المستخدم بالنوع الذي يتم استخدامه. من الطرق السهلة للتمييز بين أنواع المتغيرات اللون.

إضافة متغيرات إلى مجموعة الأدوات

لجعل هذا النوع الجديد من المتغيرات مفيدًا للمستخدمين، تحتاج إلى إضافة طريقة لإنشاء المتغيرات الجديدة واستخدامها.

أنشئ فئة ديناميكية جديدة للمتغيرات إذا لم تكن لديك فئة حالية.

أضف عناصر get وseters الجديدة إلى الفئة.

زر إنشاء متغيّر

بعد ذلك، يحتاج المستخدم إلى طريقة لإنشاء المتغيرات. أبسط طريقة هي استخدام الزر "إنشاء متغيّر".

عند إنشاء الزر، يمكنك إجراء معاودة الاتصال.

Blockly.Variables.createVariableButtonHandler(button.getTargetWorkspace(), null, 'panda');

وسيتم إنشاء متغير كتابة Panda!

أسهل طريقة للسماح للمستخدمين بإنشاء متغيّرات من أنواع متعددة هي استخدام زر "إنشاء" واحد لكل نوع (على سبيل المثال، إنشاء متغيّر سلسلة، وإنشاء متغيّر رقم، وإنشاء متغيّر Panda).

إذا كان لديك أكثر من نوعين أو ثلاثة من المتغيرات، يمكنك أن ينتهي بك الأمر بسرعة إلى تضمين عدد كبير جدًا من الأزرار. في هذه الحالة، يمكنك استخدام @blockly/plugin-typed-variable-modal لعرض نافذة منبثقة يمكن للمستخدمين من خلالها اختيار نوع المتغيّر المطلوب.

تحديد أدوات الإنشاء

أخيرًا، عليك تحديد أدوات إنشاء رمز الكتل للكتل المتغيّرة الجديدة. يمكنك أيضًا الوصول إلى قائمة المتغيّرات مباشرةً باستخدام Blockly.Workspace.getAllVariables() للحصول على جميع المتغيّرات من جميع الأنواع أو Blockly.Workspace.getVariablesOfType() للحصول على جميع المتغيّرات من نوع معيّن.