Verbindungsprüfungen schränken ein, welche Verbindungen (und damit Blöcke) eine Verbindung herstellen können miteinander kommunizieren.
Verbindungsprüfungen sind für Modellierungstypen nützlich. Beispiel: drei Blöcke sind nicht miteinander verbunden, da sie Code darstellen, der gibt verschiedene Typen zurück:
Mit Verbindungsprüfungen kann verhindert werden, dass diese Blöcke eine Verbindung herstellen. Dieses gibt den Nutzenden sofortiges Feedback und vermeidet viele einfache Fehler.
Funktionsweise
Jede Verbindung kann einer „Verbindungsprüfung“ zugeordnet werden. ein Nullwert zulässig ist, Array von Zeichenfolgen.
Zwei Verbindungen können in folgenden Fällen verbunden werden:
- Es sind kompatible Typen (z.B. eine Ausgabe, die eine Verbindung zu eine Eingabe).
- Sie haben mindestens einen String in ihrer Verbindungsprüfung gemeinsam.
Die folgenden beiden Prüfungen könnten beispielsweise eine Verbindung herstellen, da sie den gleichen
'apple'
-String:
['apple', 'ball', 'cat']
['apple', 'bear', 'caterpillar']
Bei diesen beiden Prüfungen konnte jedoch keine Verbindung hergestellt werden, da sie keine Strings gemeinsam haben:
['apple', 'ball', 'cat']
['ape', 'bear', 'caterpillar']
Es gibt noch einen weiteren Sonderfall. Wenn eines der Arrays null
ist, dann sind die beiden
Verbindungen herstellen können. So können Sie Verbindungen definieren,
für alles.
null
['ape', 'bear', 'caterpillar]
Vorabprüfung einrichten
Standardmäßig haben alle Verbindungen eine null
-Verbindungsprüfung, d. h., sie können
mit allem, was Sie brauchen. Verbindungsprüfungen müssen manuell zugewiesen werden.
Wie Sie Verbindungen Verbindungsprüfungen zuweisen, hängt davon ab, unabhängig davon, ob Sie JSON-Blockdefinitionen oder JavaScript-Blockdefinitionen verwenden.
JSON
Bei Verbindungen auf oberster Ebene weisen Sie die Prüfung direkt der Property zu, die
definiert die Verbindung. Der Wert, den Sie zuweisen, kann null
sein, ein String (der
der einzige Eintrag in der Verbindungsprüfung wird) oder ein String-Array.
{
'type': 'custom_block',
'output': null,
'nextStatement': 'a connection check entry',
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Bei Eingaben können Sie die Diagnose dem Attribut check
der Eingabe zuweisen.
Definition. Wenn das Attribut check
nicht vorhanden ist, wird die Prüfung durchgeführt
null
. Der Wert, den Sie zuweisen, kann ein String oder ein Array von Strings sein.
{
'type': 'custom_block',
'message0': '%1 %2',
'args0': [
{
'type': 'input_value',
'check': 'a connection check entry'
},
{
'type': 'input_statement',
'check': ['four', 'connection', 'check', 'entries']
}
]
}
JavaScript
Für Verbindungen auf oberster Ebene können Sie die Prüfung direkt an die Methode übergeben,
definiert die Verbindung. Wird ein Wert nicht übergeben, wird die Prüfung
null
Bei dem Wert, den Sie übergeben, kann es sich um einen String handeln. Dieser wird der einzige Eintrag im
Verbindungsprüfung) oder ein String-Array verwenden.
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']);
}
}
Bei Eingaben können Sie die Prüfung an die Methode setCheck
übergeben, nachdem Sie
die Eingabe definiert hat. Wird die Methode setCheck
nicht aufgerufen, wird geprüft,
als null
betrachtet. Der Wert, den Sie übergeben, kann ein String oder ein Array von Strings sein.
Blockly.Blocks['custom_block'] = {
init: function() {
this.appendValueInput('NAME')
.setCheck('a connection check entry');
this.appendStatementInput('NAME')
.setCheck(['four', 'connection', 'check', 'entries']);
}
}
Integrierte Prüfzeichenfolgen
Die integrierten Blöcke haben Verbindungsprüfungen mit den Werten 'Array'
,
'Boolean'
, 'Colour'
, 'Number'
und 'String'
. Wenn Ihre Blockierungen
mit den integrierten Blöcken interagieren, können Sie diese Werte verwenden,
kompatibel sind.
Beispiele für Werte
Wenn Sie Verbindungsprüfungen für Ein- und Ausgaben definieren, sollten Sie sich die Prüfungen als Typen vorstellen.
Eingaben Überprüfungen sollten jeden „type“ enthalten die sie akzeptieren, und gibt Vorabprüfung sollte genau enthalten, was sie „zurückgeben“.
Einzelnen Typ akzeptieren
Im einfachsten Fall, wenn Sie einen Block erstellen möchten, oder „Retouren“ eines Typs müssen Sie diesen bei der Verbindungsprüfung einbeziehen.
Mehrere Typen akzeptieren
Um einen Block zu erstellen, der „annimmt“ müssen Sie alle akzeptierten Typ bei der Verbindungsprüfung der Eingabe.
Konventionsgemäß kann eine Ausgabe manchmal in mehreren Situationen akzeptiert werden Wenn Sie z.B. manchmal Zahlen als Strings zulassen, sollte die Ausgabe so aussehen: restriktiver sein und die Eingabe(en) sollte(n) großzügiger sein. Diese Konvention sorgt dafür, dass die Ausgaben nicht an Stellen verbunden werden, die nicht unterstützt werden.
Beliebige Art akzeptieren
Um einen Block zu erstellen, der „annimmt“ müssen Sie den Typ der Eingabe
Verbindungsprüfung zu null
.
Untertypen der Rückgabe
Um einen Block zu erstellen, der müssen Sie sowohl den Typ und den Supertyp in der Verbindungsprüfung der Ausgabe.
Bei Untertypen ist es in Ordnung, wenn eine Ausgabeprüfung mehrere Prüfungen umfasst, da der Block immer "wiedergibt", für beide Typen.
Parametrisierte Typen zurückgeben
Um einen Block zu erstellen, der parametrisiert werden, müssen Sie sowohl die parametrisierte Version und die nicht parametrisierte Version in der Ausgabe Verbindungsprüfung.
Je nachdem, wie streng die Blocksprache sein soll, Einschließen der Abweichungen des Typs.
Wie bei Untertypen ist es in Ordnung, wenn eine Ausgabeprüfung mehrere Prüfungen umfasst. da der Block immer "zurückgibt", für beide Typen.
Beispiele für Stacks oder Anweisungen
Es gibt einige gängige Methoden, mit denen Entwickler Prüfungen für vorherige und nächste Verbindungen. Normalerweise schränken Sie damit die Reihenfolge der Blöcke ein.
Die nächsten Verbindungen sollten angeben, welche Blöcke auf den aktuellen folgen sollen, und vorherige Verbindungen beinhalten, was der aktuelle Block „ist“.
Reihenfolge der Blockierungen beibehalten
Um eine Reihe von Blöcken zu erstellen, die in einer definierten Reihenfolge miteinander verbunden werden, müssen Sie welche Blöcke bei der nächsten Verbindungsprüfung auf den aktuellen Block folgen sollen, und was der aktuelle Block „ist“ in der vorherigen Verbindungsprüfung.
Viele mittlere Blöcke zulassen
Um eine Reihe von geordneten Blöcken zu erstellen, die viele mittlere Blöcke ermöglichen, müssen Sie Nehmen Sie mindestens einen Eintrag aus dem vorherigen Verbindungscheck des mittleren Blocks auf. die nächste Verbindungsprüfung des mittleren Blocks. So können Sie dem Block für sich genommen hat.
Keine mittleren Blöcke zulassen
Um einen Satz geordneter Blöcke zu erstellen, bei denen die mittleren Blöcke optional sind, müssen Sie , um mindestens einen Eintrag aus der vorherigen Verbindung des mittleren Blocks anzugeben und die vorherige Verbindungsprüfung des letzten Blocks Verbindungsprüfung. So kann auf den ersten Block entweder ein mittlerer oder einem letzten Block.
Entweder-oder-Stacks
So erstellen Sie einen Block, auf den nur Blockierungen aus einer Gruppe oder Blockierungen folgen können: von einem anderen (und nicht aus beiden) entfernt werden, müssen Sie zwei Dinge tun:
Du musst mindestens einen Eintrag aus den beiden vorherigen Gruppen hinzufügen Verbindungsprüfungen in der nächsten Verbindungsprüfung im ersten Block.
Sie müssen die Gruppen Nächste Verbindungsprüfung, um nur Werte einzubeziehen die bereits in den vorherigen Verbindungsprüfungen enthalten sind. durch Blöcke derselben Gruppe).
Beschränkungen
Dieses System ist sehr stabil und löst viele Anwendungsfälle, hat aber einige Einschränkungen.
Den übergeordneten Kontext einschränken
Dieses System an sich unterstützt keine Einschränkung des „größeren Kontexts“ in
die eine Verbindung herstellen darf. Sie können beispielsweise nicht sagen, dass ein
Der Block break
darf nur innerhalb eines Blocks vom Typ loop
vorhanden sein. Die Verbindung
berücksichtigt, dass das System nur die beiden unmittelbar verbundenen Verbindungen berücksichtigt.
Sie können dies unterstützen, indem Sie das Ereignissystem verwenden, um block Move und prüfen Sie, ob der Block falsch positioniert ist.
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;
},
}
Allgemeine Typen
Dieses System selbst unterstützt die Definition generischer Typen nicht. Beispiel: können Sie keine „Identität“ und diese „Antworten“ unabhängig von ihrer Eingabe.
Sie können dies eher unterstützen, indem Sie die Verbindungsprüfung auf der an die Eingabe anzupassen. Das können Sie mit dem Ereignissystem tun, auf „Move-Ereignisse blockieren“.
Blockly.Blocks['custom_block'] = {
init: function() { }
onchange: function(e) {
if (e.type !== Blockly.Events.BlockMove) return;
this.setOutput(
true, this.getInputTargetBlock()?.outputConnection.getCheck());
}
}
Wenn der verbundene Block jedoch auch generisch ist, funktioniert das nicht richtig. In diesem Fall gibt es keine geeignete Lösung.
Verbindungsprüfung
Wenn dieses System für Ihren Anwendungsfall nicht geeignet ist, können Sie auch die werden die Verbindungsprüfungen durch Erstellen eines benutzerdefinierte Verbindungsprüfung.
Wenn Sie z. B. ein fortschrittlicheres System entwickeln möchten, das einige Einschränkungen hier beschrieben, können Sie ein benutzerdefiniertes Verbindungsprüfung.