Değişkenler

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.

Bir değişken seçmek, mevcut değişkenin adını değiştirmek veya mevcut değişkeni silmek için açılır menü içeren bir değişken alanı.

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:

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 için getter ve setter blokları
`foo`.

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.

"Değişken oluştur" düğmesini içeren "Değişkenler" adlı açık bir kategori.

Yeni alıcılarınızı ve ayarlayıcılarınızı kategoriye ekleyin.

"foo" ve "bar" değişkenleri oluşturulduktan sonraki kategori. "Değişken oluştur" düğmesi, set-variable-to ve change-variable-by blokları ile getter blokları içerir.

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.