Değişkenler, önemli bir programlama kavramıdır. Blockly, Python ve JavaScript gibi dinamik olarak türü belirlenmiş dilleri destekler. Biraz daha fazla çalışarak Java veya C gibi kesin olarak türü belirlenmiş dilleri (ya da statik olarak türü belirlenmiş dilleri) destekleyecek bilgiler ekleyebilirsiniz.
Dinamik ve statik olarak yazılmış diller hakkında daha fazla bilgi için Veri Türlerine Giriş: Statik, Dinamik, Güçlü ve Zayıf başlıklı makaleyi inceleyin.
Blockly, kullanıcının sağladığı değişkenlerin adlarını gösteren dinamik açılır kutular olan değişken alanları sağlar. Aşağıda bununla ilgili bir örnek verilmiştir.
Blockly, varsayılan olarak bir değişkene herhangi bir türün atanmasına izin verir ve Blockly'nin sağladığı tüm oluşturucular dinamik olarak türü belirlenmiş diller içindir. Bunun yerine yazılı bir dil kullanıyorsanız Blockly'yi bu dili destekleyecek şekilde yapılandırmak için aşağıdakileri yapabilirsiniz:
- Getter'lar ve setter'lar dahil olmak üzere değişken türünü ve bloklarını belirtin.
- Değişken türünüzü ve bloklarınızı kullanmak için araç kutusunu yapılandırın.
- Değişkenler ve blokları için üreticiler tanımlayın.
Türsüz Değişken Blokları
Bir değişkene erişmek ve onu değiştirmek için kullanılan en temel bloklar getter ve setter bloklarıdır. Blockly'nin sağladığı getter ve setter bloklarına göz atalım.
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);
...
}
};
Bu işlem, aşağıdaki iki bloğu oluşturur:
Değişken alıcının "çıkışını" null olarak ayarladığınızda dönüş değerinin herhangi bir türde olabileceğini unutmayın. Ayrıca, değişken ayarlayıcının girişinde herhangi bir kontrol belirtilmediğini de unutmayın. Bu nedenle, değişken herhangi bir değer türüne ayarlanabilir.
Yazılan Değişken Blokları
Tür kontrolünü zorunlu kılan alıcılar ve ayarlayıcılar ekleyebilirsiniz. Örneğin, "Panda"
türünde bir değişken oluşturduysanız aşağıdaki tanımlar uygun türlerde bir alıcı ve ayarlayıcı oluşturur.
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);
...
}
};
Bu işlem, alıcı ve ayarlayıcı olmak üzere iki tür blok oluşturur. Bunların açılır listelerinde yalnızca "Panda"
türündeki değişkenler gösterilir. Giriş ve çıkışları yalnızca "Panda"
türündeki bağlantıları kabul eder. Alanın defaultType
değeri, variableTypes
dizisindeki değerlerden biri olarak ayarlanmalıdır. variableTypes
dizisi sağlanırken defaultType
ayarlanmaması hataya neden olur.
Varsayılan olarak, kullanıcıya hangi türün kullanıldığını bildiren görsel bir gösterge yoktur. Değişken türlerini ayırt etmenin kolay bir yolu renk kullanmaktır.
Araç kutusuna değişken ekleme
Bu yeni değişken türünün kullanıcılarınız için yararlı olması amacıyla yeni değişkenleri oluşturup kullanmanın bir yolunu eklemeniz gerekir.
Henüz yoksa değişkenler için yeni bir dinamik kategori oluşturun.
Yeni alıcılarınızı ve ayarlayıcılarınızı kategoriye ekleyin.
Değişken Oluşturma Düğmesi
Ardından, kullanıcınızın değişken oluşturması gerekir. En basit yöntem, "Değişken Oluştur" düğmesini kullanmaktır.
Düğmeyi oluştururken geri çağırma işlevini çağırın.
Blockly.Variables.createVariableButtonHandler(button.getTargetWorkspace(), null, 'panda');
ve "Panda"
türünde bir değişken oluşturulur.
Kullanıcıların birden fazla türde değişken oluşturmasına izin vermenin en kolay yolu, her tür için bir "oluştur" düğmesi (ör. dize değişkeni oluştur, sayı değişkeni oluştur, panda değişkeni oluştur) kullanmaktır.
İkiden veya üçten fazla değişken türünüz varsa çok fazla düğme oluşabilir. Bu durumda, kullanıcıların istedikleri değişken türünü seçebilecekleri bir pop-up göstermek için @blockly/plugin-typed-variable-modal'ı kullanabilirsiniz.
Üreticileri tanımlama
Son olarak, yeni değişken bloklarınız için blok kodu oluşturucuları tanımlamanız gerekir. Ayrıca, tüm değişken türlerinin tüm değişkenlerini almak için Workspace.getVariableMap().getAllVariables()
, belirli bir türdeki tüm değişkenleri almak için Workspace.getVariableMap().getVariablesOfType()
ile doğrudan değişken listesine erişebilirsiniz.