المتغيرات

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

إليك المزيد من التفاصيل معلومات حول اللغات الديناميكية مقارنةً باللغات المكتوبة الثابتة.

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

بشكل افتراضي، يسمح Blockly بتعيين أي نوع لمتغير وجميع تعتبر أدوات إنشاء Blockly للغات المكتوبة ديناميكيًا. إذا كنت باستخدام لغة مكتوبة بدلاً من ذلك، يمكنك ضبط Blockly لدعمها من خلال تنفيذ ما يلي:

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

الكتل البرمجية الأساسية للوصول إلى المتغير ومعالجتها هي دالة getter. وتحديدها. هيا نستعرض كُتل الاستدعاء والضبط التي التي يوفرها.

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"، فإن التعريفات التالية تنشئ والضبط والضبط بالأنواع المناسبة.

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 إلى ظهور خطأ.

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

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

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

إنشاء فئة ديناميكية جديدة للمتغيرات إذا لم يكن لديك واحدة بالفعل.

أضف الأشخاص الجدد واللاعبين الجدد إلى الفئة.

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

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

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

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

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

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

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

تعريف المنشئين

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