接続チェック

接続チェックは、どの接続(およびそれによってブロック)が接続できるかを制限する 相互に通信します。

接続チェックはモデリング タイプに役立ちます。たとえば、次のようになります。 ビジネスが関連付けられていません。この 3 つのブロックは、 次のタイプが返されます。

空の list ブロックは、平方根のブロックとつながっており、
大文字ブロック

接続チェックを使用すると、これらのブロックの接続を防ぐことができます。この ユーザーに即座にフィードバックを提供し、多くの単純なミスを防ぐ。

仕組み

すべての接続を「接続チェック」に関連付けることができるこれは null 値許容の 文字列の配列。

次の 2 つの接続を接続できます。

  1. それらは互換性のある(例: あります。
  2. 接続チェックに共通する文字列が 1 つ以上あります。

たとえば、次の 2 つのチェックは、同じ IP アドレスを使用して 'apple' 文字列:

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

しかし、これら 2 つのチェックは文字列を共有していないため、接続できませんでした。

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

その他の特殊なケースが 1 つあります。いずれかの配列が null の場合、2 つの配列 接続も接続できますこれにより、接続を定義できる接続を定義できます。 何でもできます

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'。ブロックを これらの値を使用して、組み込みブロックと 対応しています。

値の例

入力と出力の接続チェックを定義する場合、通常は チェックはタイプを表すと考えてください。

入力すべての「type」を含むルールを出力文のチェック 「返される」ものと正確に一致させる必要があります。

単一の型を受け入れる

「受け入れる」ブロックを作成する最も基本的なケースでは、「returns」 そのタイプを接続の接続チェックに含める必要があります。

単一の型を受け入れる value ブロック

複数のタイプを受け入れる

「新規顧客の獲得」目標を複数のタイプがある場合は、それらの 入力の接続チェックで受け入れられたタイプ。

複数の型を受け入れる値ブロック

慣例として、出力が複数の状況で受け入れられる場合がある場合について (たとえば、数値を文字列として使用できるようにする場合)は、出力を 制限を緩め、入力には制限を緩めます。この規則は サポートされていない場所に出力が接続されないようにします

すべての型を受け入れる

「新規顧客の獲得」目標をどの型の場合でも、入力の null への接続チェック。

任意の型を受け入れる value ブロック

サブタイプを返す

「返される」ブロックを作成するには、両方のタイプを含める必要があります。 出力の接続チェックでスーパータイプを指定する必要があります。

型とそのスーパータイプを返す value ブロック

サブタイプの場合は、出力チェックに複数のチェックを入れても問題ありませんが、 ブロックは常に「返される」ため、両方のタイプがあります。

パラメータ化された型を返す

「返される」ブロックを作成するには、パラメータ化された型の場合は、両方を含める必要があります。 パラメータ化されたバージョンとパラメータ化されていないバージョンを 接続チェックを行います

ブロック言語の厳格さに応じて、 型の分散が含まれます。

パラメータ化された型とパラメータ化されていない値を返す value ブロック
種類

サブタイプと同様に、出力チェックに複数のチェックを含めても問題ない この場合は、ブロックから常に「返される」ため、両方のタイプがあります。

スタックまたはステートメントの例

デベロッパーが「前」と「次の」のチェックを定義する一般的な方法はいくつか 接続します通常、これらはブロックの順序を制限するものだと考えています。

次の接続には、現在の接続に続くブロックを含める必要があります。 以前の接続には、現在のブロックが「何であるか」が含まれます。

ブロックを整理する

定義された順序で接続するブロックのセットを作成するには、 次回の接続チェックで現在のブロックに従うべきブロック 現在のブロックが「何であるか」を確認します。

順序が強制されているステートメント ブロックを

中央のブロックを多数許可する

多数の中間ブロックを許可する順序付きのブロックのセットを作成するには、 中央ブロックの前回の接続チェックインからのエントリを 1 つ以上含める 中間ブロックの次の接続チェックに移ります。これにより そのブロックを 考えてみましょう。

多数の中間ブロックを許可するステートメント ブロック

中間のブロックを許可しない

中央のブロックが省略可能で、順序付きのブロックのセットを作成するには、 中央ブロックの前の接続から少なくとも 1 つのエントリが含まれる 最後のブロックの前の接続チェックが、最初のブロックの 接続チェックを行いますこれにより、最初のブロックの後に中央のブロックが続く 決定することもできます

中間ブロックを許可しないステートメント ブロックを

どちらか一方のスタック

1 つのグループのブロックのみ、または 1 つのグループのブロックだけが続くブロックを作成するには 両方ではなく、もう一方のプロパティを使用する場合は、次の 2 つの操作を行う必要があります。

  1. 上記の両方のグループのエントリを 1 つ以上含める必要があります 最初のブロックの次の接続チェックで、接続チェックが実行されます。

  2. グループを定義する次の接続チェックでは、値のみ 以前の接続チェックに含まれていた IP アドレスが使用されます(したがって、 同じグループのブロックです。

1 つのタイプのブロックが後に続く可能性があるステートメント ブロック、または
両方不可

制限事項

このシステムは非常に堅牢で多くのユースケースを解決できますが、 あります。

より大きなコンテキストを制限する

このシステム自体は、「より大きいコンテキスト」の制限をサポートしません。 接続が許可される接続を指定します。たとえば、 break ブロックは、loop ブロック内にのみ存在できます。つながり チェック システムは、直接接続している 2 つの接続のみを考慮します。

これは、イベント システムを使用してリッスンすることでサポートできますブロック移動イベントを検出して、ブロックが正しく配置されていないかどうかを確認します。

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;
  },
}

一般的な種類

このシステムだけでは、汎用型の定義をサポートしていません。たとえば 「ID」やブロックで、その入力がどのようなものであれ

接続チェックを積極的に変更することで、これをある程度サポートできます。 その入力に一致するように調整します。イベント システムを使用すると、 ブロック移動イベントをリッスンします

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

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

一方、接続ブロックが汎用ブロックの場合、正しく機能しません。 この場合、適切な回避策はありません。

接続チェッカー

このシステムがユースケースに合わない場合は、 接続チェックを比較する際には、 カスタム接続チェッカー

たとえば、データ アナリストが開発したデータの一部を処理する、 制限事項がありますが、独自のカスタム スコープを作成して 表示されます。