連線檢查

連線檢查會限制哪些連線 (以及區塊) 互相交流

連線檢查適用於模擬類型。例如,下列 三個區塊不會連結到任何業務,因為它們代表 會傳回不同類型:

空白清單區塊,連結至正方形根區塊,已連結至
大寫區塊

連線檢查可以用來防止這類區塊無法連線。這個 為使用者提供即時意見回饋,避免許多簡單錯誤。

運作方式

每個連線都能與「連線檢查」建立關聯如果是可為空值 字串陣列。

發生以下情況時,可以連線兩個連線:

  1. 這些是相容的類型 (例如: 輸入內容)。
  2. 他們在連線檢查中至少有一個共通字串。

舉例來說,下列兩項檢查可以連結,因為這兩項檢查均共用 'apple' 字串:

['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']

但這兩項檢查並未共用任何字串,因此無法連線:

['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']

此外還有一種特殊情況。如果其中一個陣列是 null,則兩個陣列 也能連線這可讓您定義 到任何事物都沒問題

null
['ape', 'bear', 'caterpillar]

設定檢查

根據預設,所有連線都會執行 null 連線檢查,這表示這些連線可以 連線至任何網路您必須手動指派連線檢查。

指派連線檢查的方式會因連線而異 使用 JSON 區塊定義或 JavaScript 區塊定義

JSON

如果是頂層連線,請直接將檢查指派給該資源 會定義連線您指派的值可以是 null 字串 (此 成為連線檢查的唯一項目),或字串陣列。

{
  'type': 'custom_block',

  'output': null,
  'nextStatement': 'a connection check entry',
  'previousStatement': ['four', 'connection', 'check', 'entries']
}

對於輸入,您可以將檢查指派給輸入的 check 屬性 定義如果 check 屬性不存在,則視為檢查 null。您指派的值可以是字串或字串陣列。

{
  'type': 'custom_block',
  'message0': '%1 %2',

  'args0': [
    {
      'type': 'input_value',
      'check': 'a connection check entry'
    },
    {
      'type': 'input_statement',
      'check': ['four', 'connection', 'check', 'entries']
    }
  ]
}

JavaScript

如果是頂層連線,您可以直接將檢查通過 會定義連線如未傳遞值,系統會視為檢查 null。您傳遞的值可以是字串 (成為 連線檢查) 或字串陣列。

Blockly.Blocks['custom_block'] = {
  init: function() {
    this.setOutput(true); // null check
    this.setNextStatement(true, 'a connection check entry');
    this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
  }
}

對於輸入內容,您可以先將檢查傳遞至 setCheck 方法, 會定義輸入內容如果未呼叫 setCheck 方法,則檢查 視為 null。您傳遞的值可以是字串或字串陣列。

Blockly.Blocks['custom_block'] = {
  init: function() {
    this.appendValueInput('NAME')
        .setCheck('a connection check entry');
    this.appendStatementInput('NAME')
        .setCheck(['four', 'connection', 'check', 'entries']);
  }
}

內建檢查字串

內建區塊會使用 'Array' 值進行連線檢查。 'Boolean''Colour''Number''String'。如果希望封鎖 與內建區塊互通,而您可以使用這些值 相容。

值範例

定義輸入和輸出內容的連線檢查時,通常需 應將檢查視為代表類型

輸入內容檢查應包含每個「類型」模型接受並輸出檢查 應包含「傳回」的內容

接受單一類型

在最基本的情況下,您會想要建立「接受」的封鎖或「退貨」 其中一種類型,您必須在連線的連線檢查中加入該類型。

接受單一類型的值區塊

接受多種類型

若要建立「接受」的封鎖條件您需要加入每種類型 輸入連線連線檢查中接受的類型

可接受多種類型的值區塊

按照慣例,如果系統有時可以在多種情況下接受輸出 (例如,如果您允許有時將數字做為字串使用),則輸出結果應會如下所示: 且輸入內容應較寬鬆。這項慣例 確保輸出內容在不支援的位置不會連線。

接受任何類型

若要建立「接受」的封鎖條件任何類型,您必須設定 「null」連線檢查。

可接受任何類型的值區塊

傳回子類型

如要建立能「傳回」的區塊子類型,您必須同時加入 輸出內容連線檢查中的超級類型

傳回其類型及其超級類型的值區塊

如果是子類型,可以在輸出檢查中多次檢查、 因為區塊「一律」「傳回」這兩種語言

傳回參數化類型

如要建立能「傳回」的區塊參數化類型,您需要同時加入 參數化版本和未參數化版本 (在輸出內容的 「連線檢查」。

根據你想對封鎖語言設下的嚴格程度 包含類型的變異數

值區塊,會傳回其參數化類型及其未參數化的值
類型

和子類型一樣,在輸出檢查中多次檢查項目也沒問題 因為區塊「一律」「傳回」這兩種語言

堆疊或陳述式範例

開發人員可以透過幾種常見方式定義先前和下一次的檢查 連線狀態。一般會將這些限制視為限制區塊的排序順序。

下一個連線應包含應遵循目前設定的區塊,並且 先前的連線包含目前區塊的「為」

讓方塊保持順序

如要建立按指定順序連接的一組區塊,您必須加入 這些區塊應在下次連線檢查時接續目前的連線狀態,以及 目前區塊的「是」用於先前的連線檢查

陳述式封鎖限制

允許大量的中間區塊

如要建立一組允許許多中間區塊的已排序區塊,您必須 至少加入一個來自中間區塊先前連線檢查的項目 中央區塊的下一次連線檢查如此一來 來解決問題

陳述式區塊允許有許多中間區塊

不允許任何中間方塊

如要建立一組已排序的區塊,並可選擇中間區塊做為選用,請 至少加入一個來自中間區塊先前連線的項目 並在第一個區塊的下一個區塊中檢查最後一個區塊 「連線檢查」。這樣一來,第一個區塊後面會接著一個中間 或最後一個區塊

不允許使用中間區塊的陳述式區塊

任一或堆疊

建立只能追蹤某個群組 (或稱封鎖項目) 的封鎖條件 您需要執行兩項操作 (兩者只能擇一):

  1. 您必須至少加入兩個舊群組內的項目 並在第一個區塊的下一次連線檢查時進行連線檢查。

  2. 您必須定義下次連線檢查時,僅納入值 這些位置會進行先前的連線檢查 按相同分組的區塊)。

陳述式區塊,後面可加上同一種區塊的多種情況,或
多個執行個體 (但不能同時採用)

限制

這個系統相當完善,可解決許多用途,但還只有少數幾個

限制更多背景資訊

這個系統本身並不支援限制「背景資訊」英吋 允許連線舉例來說,您不能使用 break 區塊只能出現在 loop 區塊中。連結 檢查系統只會將立即兩個連線列入考量。

如要支援這項功能,您可以使用事件系統監聽 區塊移動事件,並檢查區塊的位置是否有誤。

Blockly.Blocks['custom_block'] = {
  init: function() { }

  onchange: function(e) {
    if (this.workspace.isDragging()) return;
    if (e.type !== Blockly.Events.BlockMove) return;
    if (!this.getSurroundLoop()) this.outputConnection.disconnect();
  }

  loopTypes: new Set(); // Your valid *block types* (not connection checks).

  getSurroundLoop: function () {
    let block = this.getSurroundParent();
    do {
      if (loopTypes.has(block.type)) return block;
      block = block.getSurroundParent();
    } while (block);
    return null;
  },
}

一般類型

這個系統本身不支援定義一般類型。例如: 您無法建立「身分」區塊,「傳回」不論輸入什麼東西

如要「有點」支援這項功能,您可以主動變更 來比對輸入內容事件系統的用途 監聽封鎖動作事件

Blockly.Blocks['custom_block'] = {
  init: function() { }

  onchange: function(e) {
    if (e.type !== Blockly.Events.BlockMove) return;
    this.setOutput(
        true, this.getInputTargetBlock()?.outputConnection.getCheck());
  }
}

不過,如果連線的區塊「也是」一般情況,就無法正常運作。 對於這個情況並無助益。

連線檢查工具

如果這個系統不適合您的用途,您也可以 系統會建立 自訂連線檢查工具

舉例來說,如果您想建立更進階的系統 限制,您可以建立自訂回應 連線檢查工具