المتغيّرات هي مفهوم مهم في البرمجة. تتوافق Blockly مع اللغات ذات الأنواع المحدّدة ديناميكيًا، مثل Python وJavaScript. ويمكنك إضافة معلومات لدعم اللغات ذات الأنواع المحدّدة بقوة (أو اللغات ذات الأنواع المحدّدة بشكل ثابت)، مثل Java أو C، وذلك من خلال بذل القليل من الجهد الإضافي.
لمزيد من المعلومات عن اللغات ذات الأنواع المحدّدة ديناميكيًا مقابل اللغات ذات الأنواع المحدّدة بشكل ثابت، يُرجى الاطّلاع على مقالة مقدمة عن أنواع البيانات: ثابتة وديناميكية ومحدّدة بقوة و & محدّدة بضعف.
توفّر Blockly حقول متغيّرات، وهي مربّعات منسدلة ديناميكية تعرض أسماء المتغيّرات التي قدّمها المستخدِم. في ما يلي مثال على أحدها.

تسمح Blockly تلقائيًا بتعيين أي نوع لمتغيّر، وجميع أدوات إنشاء التعليمات البرمجية التي توفّرها Blockly مخصّصة للغات ذات الأنواع المحدّدة ديناميكيًا. إذا كنت تستخدم لغة ذات أنواع محدّدة، يمكنك ضبط Blockly لتتوافق معها باتّباع الخطوات التالية:
- حدِّد نوع المتغيّر والكتل الخاصة به، بما في ذلك أدوات الحصول على القيم وتعيينها.
- اضبط مجموعة الأدوات لاستخدام نوع المتغيّر الخاص بك والكتل.
- حدِّد أدوات إنشاء التعليمات البرمجية للمتغيّرات والكتل الخاصة بها.
كتل المتغيّرات غير المحدّدة النوع
إنّ أبسط الكتل للوصول إلى متغيّر ومعالجته هي كتل إرجاع القيمة وتحديدها. لنتعرّف على كتل إرجاع القيم وتحديدها التي توفّرها 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);
...
}
};
يؤدي هذا إلى إنشاء الكتلتَين التاليتَين:

من التفاصيل المهمة التي يجب ملاحظتها أنّه من خلال ضبط "الإخراج" لأداة الحصول على قيمة المتغيّر على null، يمكن أن يكون نوع القيمة المعروضة أي نوع. يُرجى أيضًا ملاحظة أنّ إدخال أداة تعيين قيمة المتغيّر لا يحدّد أي عمليات تحقّق. نتيجةً لذلك، يمكن ضبط المتغيّر على أي نوع من القيم.
كتل المتغيّرات المحدّدة النوع
يمكنك إضافة أدوات الحصول على القيم وتعيينها التي تفرض التحقّق من النوع. على سبيل المثال، إذا
أنشأت متغيّرًا من النوع "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 Panda 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 Panda 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);
...
}
};
يؤدي هذا إلى إنشاء نوعَين من الكتل، وهما أداة إرجاع القيمة وأداة تحديد القيمة. لا تعرض القوائم المنسدلة سوى
المتغيّرات من النوع "Panda". لا تقبل الإدخالات والمخرجات سوى
الاتصالات من النوع "Panda". يجب ضبط defaultType للحقل على إحدى القيم في مصفوفة variableTypes. سيؤدي عدم ضبط defaultType أثناء توفير مصفوفة variableTypes إلى ظهور خطأ.
تلقائيًا، لا يوجد مؤشر مرئي لإعلام المستخدِم بالنوع المستخدَم. إحدى الطرق السهلة للتمييز بين أنواع المتغيّرات هي استخدام الألوان.
إضافة متغيّرات إلى مجموعة الأدوات
لجعل هذا النوع الجديد من المتغيّرات مفيدًا للمستخدِمين، عليك إضافة طريقة لإنشاء المتغيّرات الجديدة واستخدامها.
أنشئ فئة ديناميكية جديدة للمتغيّرات إذا لم يكن لديك فئة.

أضِف أدوات الحصول على القيم وتعيينها الجديدة إلى الفئة.

زر "إنشاء متغيّر"
بعد ذلك، يحتاج المستخدِم إلى طريقة لإنشاء المتغيّرات. أبسط طريقة هي استخدام زر "إنشاء متغيّر" .
عند إنشاء الزر، اجعل معاودة الاتصال تستدعي
Blockly.Variables.createVariableButtonHandler(button.getTargetWorkspace(), null, 'panda');
وسيتم إنشاء متغيّر من النوع "Panda"
أسهل طريقة للسماح للمستخدِمين بإنشاء متغيّرات من أنواع متعددة هي استخدام زر "إنشاء" واحد لكل نوع (مثل "إنشاء متغيّر سلسلة" و"إنشاء متغيّر رقم" و"إنشاء متغيّر باندا").
إذا كان لديك أكثر من نوعَين أو ثلاثة أنواع من المتغيّرات، قد ينتهي بك الأمر سريعًا إلى وجود عدد كبير جدًا من الأزرار. في هذه الحالة، ننصحك باستخدام @blockly/plugin-typed-variable-modal لعرض نافذة منبثقة يمكن للمستخدِمين من خلالها اختيار نوع المتغيّر المطلوب.
تحديد أدوات إنشاء التعليمات البرمجية
أخيرًا، عليك تحديد أدوات إنشاء التعليمات البرمجية للكتل الجديدة
للمتغيّرات. يمكنك أيضًا الوصول إلى قائمة المتغيّرات مباشرةً باستخدام Workspace.getVariableMap().getAllVariables() للحصول على جميع المتغيّرات من جميع الأنواع أو Workspace.getVariableMap().getVariablesOfType() للحصول على جميع المتغيّرات من نوع معيّن.