משתנים

משתנים הם מושג תכנות חשוב. חסימה דינמית בשפות שונות כמו Python ו-JavaScript, ועם קצת עבודה נוספת, יכולים להוסיף מידע כדי לתמוך בשפות מוקלדות מאוד (או בהקלדה סטטית Java או C.

כאן אפשר למצוא עוד מידע על שפות דינמיות לעומת שפות הקלדה סטטית.

חסימת האספקה של שדות משתנים, שהם תיבות דינמיות עם תפריטים נפתחים שמות המשתנים שהמשתמש סיפק. הדוגמה הבאה היא של הערה כזו.

כברירת מחדל, ב-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, הערך המוחזר יכול להיות מכל סוג. כמו כן, שימו לב שהמשתנה שהקלט ב-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);
    ...
  }
};

כך נוצרים שני סוגים של בלוקים: תופסן ורכיב מגדיר. רק התפריטים הנפתחים מציגים משתנים מסוג Panda. הקלט והפלט שלו מקבלים רק חיבורים מסוג פנדה. הערך defaultType בשדה צריך להיות אחד מהערכים במערך variableTypes. לא מתבצעת הגדרה של defaultType בזמן ציון מערך variableTypes יגרום להטלת שגיאה.

כברירת מחדל אין סימן חזותי שמציין למשתמש מהו הסוג בשימוש. אחת הדרכים הפשוטות להבחין בין סוגי משתנים היא באמצעות צבע.

הוספת משתנים לארגז הכלים

כדי להפוך את סוג המשתנה החדש הזה לשימושי למשתמשים שלך, עליך להוסיף דרך ליצור את המשתנים החדשים ולהשתמש בהם.

יצירת קטגוריה דינמית חדשה עבור משתנים, אם עדיין אין לכם אחד.

מוסיפים את הגורמים והקובעים החדשים לקטגוריה.

לחצן ליצירת משתנה

בשלב הבא, המשתמש צריך דרך ליצור משתנים. הדרך הפשוטה ביותר היא "Create Variable" (יצירת משתנה) .

בזמן יצירת הלחצן, צריך לבצע את הקריאה החוזרת (callback)

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

ייווצר משתנה שמוקלד ב-Panda!

הדרך הקלה ביותר לאפשר למשתמשים ליצור משתנים מכמה סוגים היא "יצירה" אחת לחצן מכל סוג (למשל, 'יצירת משתנה מחרוזת', 'יצירת מספר' Variable, Create Panda Variable).

אם יש לכם יותר משני או שלושה סוגי משתנים, לחצנים רבים מדי. במקרה כזה, כדאי להשתמש @blockly/plugin-typed-variable-modal כדי להציג חלון קופץ שממנו המשתמשים יכולים לבחור את סוג המשתנה הרצוי.

הגדרת גנרטורים

לבסוף, תצטרכו להגדיר מחוללי קוד בלוקים. לבלוקים החדשים של המשתנים. אפשר גם לגשת ישירות לרשימת המשתנים באמצעות Blockly.Workspace.getAllVariables() , כדי לקבל את כל המשתנים מכל הסוגים, או Blockly.Workspace.getVariablesOfType() כדי לקבל את כל המשתנים מסוג מסוים.