משתנים

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

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

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

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

בלוקים של משתנים ללא הקלדה

הבלוקים הבסיסיים ביותר לגישה למשתנה ולמניפולציה שלו הם הבלוקים getter ו-setter. בואו נעבור על הבלוקים של 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);
    ...
  }
};

פעולה זו יוצרת את שני הבלוקים הבאים:

יש פרט שחשוב לשים לב לכך שאם מגדירים את ה-פלט של מקבל המשתנים כ-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 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, תתקבל הודעת שגיאה.

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

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

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

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

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

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

בשלב הבא, המשתמש צריך דרך ליצור משתנים. הדרך הפשוטה ביותר היא להשתמש בלחצן "יצירת משתנה".

כשיוצרים את הלחצן צריך לבצע קריאה חוזרת (callback)

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

ונוצר משתנה מסוג Panda!

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

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

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

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