ตัวแปรเป็นแนวคิดการเขียนโปรแกรมที่สำคัญ Blockly รองรับภาษาที่พิมพ์แบบไดนามิก เช่น Python และ JavaScript และคุณสามารถเพิ่มข้อมูลเพื่อรองรับภาษาที่พิมพ์แบบเข้มงวด (หรือภาษาที่พิมพ์แบบคงที่) เช่น Java หรือ C ได้ด้วยการทำงานเพิ่มเติมเล็กน้อย
ดูข้อมูลเพิ่มเติมเกี่ยวกับภาษาที่พิมพ์แบบไดนามิกเทียบกับภาษาที่พิมพ์แบบคงที่ได้ที่หัวข้อข้อมูลเบื้องต้น เกี่ยวกับประเภทข้อมูล: คงที่ ไดนามิก เข้มงวด & ไม่เข้มงวด
Blockly มีช่องตัวแปรซึ่งเป็นกล่องแบบเลื่อนลงแบบไดนามิกที่แสดงชื่อตัวแปรที่ผู้ใช้ระบุ ตัวอย่างเช่น

โดยค่าเริ่มต้น Blockly อนุญาตให้กำหนดประเภทใดก็ได้ให้กับตัวแปร และตัวสร้างทั้งหมดที่ Blockly มีให้ใช้สำหรับภาษาที่พิมพ์แบบไดนามิก หากคุณใช้ภาษาที่พิมพ์แทน คุณสามารถกำหนดค่า Blockly ให้รองรับภาษาดังกล่าวได้โดยทำดังนี้
- ระบุประเภทตัวแปรและบล็อกของตัวแปร รวมถึง Getter และ Setter
- กำหนดค่ากล่องเครื่องมือให้ใช้ประเภทตัวแปร และบล็อก
- กำหนดตัวสร้างสำหรับตัวแปรและบล็อกของตัวแปร
บล็อกตัวแปรที่ไม่ได้พิมพ์
บล็อกพื้นฐานที่สุดสำหรับการเข้าถึงและจัดการตัวแปรคือบล็อก 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);
...
}
};
ซึ่งจะสร้างบล็อก 2 บล็อกต่อไปนี้

รายละเอียดที่สำคัญที่ควรทราบคือการตั้งค่า "เอาต์พุต" ของ Getter ตัวแปรเป็น Null จะทำให้ค่าที่แสดงผลเป็นประเภทใดก็ได้ นอกจากนี้ โปรดสังเกตว่าอินพุตของ Setter ตัวแปรไม่ได้ระบุการตรวจสอบใดๆ ดังนั้นจึงสามารถตั้งค่าตัวแปรเป็นค่าประเภทใดก็ได้
บล็อกตัวแปรที่พิมพ์
คุณสามารถเพิ่ม 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 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);
...
}
};
ซึ่งจะสร้างบล็อก 2 ประเภท ได้แก่ Getter และ Setter โดยกล่องแบบเลื่อนลงจะแสดงเฉพาะ
ตัวแปรประเภท "Panda" และอินพุตและเอาต์พุตจะยอมรับเฉพาะ
การเชื่อมต่อประเภท "Panda" คุณต้องตั้งค่า defaultType ของฟิลด์เป็นค่าใดค่าหนึ่งในอาร์เรย์ variableTypes การไม่ตั้งค่า defaultType ขณะที่ระบุอาร์เรย์ variableTypes จะทำให้เกิดข้อผิดพลาด
โดยค่าเริ่มต้นจะไม่มีตัวบ่งชี้ด้วยภาพเพื่อบอกผู้ใช้ว่ามีการใช้ประเภทใด วิธีง่ายๆ ในการแยกความแตกต่างของประเภทตัวแปรคือการใช้ สี
เพิ่มตัวแปรลงในกล่องเครื่องมือ
หากต้องการให้ตัวแปรประเภทใหม่นี้เป็นประโยชน์ต่อผู้ใช้ คุณต้องเพิ่มวิธีสร้างและใช้ตัวแปรใหม่
สร้างหมวดหมู่แบบไดนามิก ใหม่สำหรับตัวแปรหากยังไม่มี

เพิ่ม Getter และ Setter ใหม่ลงในหมวดหมู่

ปุ่มสร้างตัวแปร
จากนั้นผู้ใช้จะต้องมีวิธีสร้างตัวแปร วิธีที่ง่ายที่สุดคือการใช้ "สร้างตัวแปร" ปุ่ม
เมื่อสร้างปุ่ม ให้กำหนดการเรียกกลับเป็น
Blockly.Variables.createVariableButtonHandler(button.getTargetWorkspace(), null, 'panda');
และระบบจะสร้างตัวแปรประเภท "Panda"
วิธีที่ง่ายที่สุดในการอนุญาตให้ผู้ใช้สร้างตัวแปรหลายประเภทคือการมีปุ่ม "สร้าง" 1 ปุ่มต่อประเภท (เช่น สร้างตัวแปรสตริง สร้างตัวแปรตัวเลข สร้างตัวแปรแพนด้า)
หากคุณมีตัวแปรมากกว่า 2 หรือ 3 ประเภท คุณอาจมีปุ่มมากเกินไป ในกรณีนี้ ให้พิจารณาใช้ @blockly/plugin-typed-variable-modal เพื่อแสดงป๊อปอัปที่ผู้ใช้สามารถเลือกประเภทตัวแปรที่ต้องการได้
กำหนดตัวสร้าง
สุดท้าย คุณจะต้องกำหนดตัวสร้างบล็อกโค้ด
สำหรับบล็อกตัวแปรใหม่ นอกจากนี้ คุณยังเข้าถึงรายการตัวแปรได้โดยตรงด้วย Workspace.getVariableMap().getAllVariables() เพื่อรับตัวแปรทั้งหมดทุกประเภท หรือ Workspace.getVariableMap().getVariablesOfType() เพื่อรับตัวแปรทั้งหมดของประเภทที่เฉพาะเจาะจง