Проверки соединений ограничивают, какие соединения (и, следовательно, блоки) могут соединяться друг с другом.
Проверки соединений полезны для типов моделирования. Например, следующие три блока не имеют никакой связи между собой, поскольку они представляют собой код, возвращающий разные типы:
Проверки соединений можно использовать для предотвращения соединения этих блоков. Это дает пользователям мгновенную обратную связь и предотвращает множество простых ошибок.
Как они работают
Каждое соединение может быть связано с «проверкой соединения», которая представляет собой массив строк, допускающий значение NULL.
Два соединения могут соединиться, если:
- Это совместимые типы (например, выход, соединяющийся со входом).
- У них есть хотя бы одна общая строка в проверке соединения.
Например, соединения со следующими двумя проверками могут соединяться, поскольку они используют общую строку '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_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Для входных данных вы можете назначить проверку свойству check
определения входных данных. Если свойство check
не существует, проверка считается null
. Назначаемое вами значение может быть строкой или массивом строк.
{
'type': 'custom_block',
'message0': '%1 %2',
'args0': [
{
'type': 'input_value',
'check': 'a connection check entry' // Accepts custom_value_block
},
{
'type': 'input_statement',
'check': ['two', 'entries'] // Accepts custom_statement_block
}
]
}
JavaScript
Для соединений верхнего уровня вы можете передать проверку непосредственно методу, определяющему соединение. Если вы не передадите значение, проверка считается null
. Передаваемое вами значение может быть строкой (которая становится единственной записью при проверке соединения) или массивом строк.
Blockly.Blocks['custom_value_block'] = {
init: function() {
this.setOutput(true, 'a connection check entry');
}
};
Blockly.Blocks['custom_statement_block'] = {
init: function() {
this.setNextStatement(true); // null check
this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
}
};
Для входных данных вы можете передать проверку методу setCheck
после того, как вы определили входные данные. Если метод setCheck
не вызывается, проверка считается null
. Значение, которое вы передаете, может быть строкой или массивом строк.
Blockly.Blocks['custom_block'] = {
init: function() {
this.appendValueInput('NAME')
.setCheck('a connection check entry'); // Accepts custom_value_block
this.appendStatementInput('NAME')
.setCheck(['two', 'entries']); // Accepts custom_statement_block
}
};
Встроенные проверочные строки
Встроенные блоки имеют проверки соединения со значениями 'Array'
, 'Boolean'
, 'Colour'
, 'Number'
и 'String'
. Если вы хотите, чтобы ваши блоки взаимодействовали со встроенными блоками, вы можете использовать эти значения, чтобы сделать их совместимыми.
Ограничения
Эта система довольно надежна и может решить множество вариантов использования, но у нее есть несколько ограничений.
Ограничить более широкий контекст
Эта система сама по себе не поддерживает ограничение «большого контекста», в котором разрешено соединение. Например, вы не можете сказать, что блоку 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());
}
}
Но если подключенный блок также является универсальным, это работает неправильно. В этом случае нет хорошего решения.
Проверка соединений
Если эта система не подходит для вашего варианта использования, вы также можете изменить способ сравнения проверок соединений, создав собственную программу проверки соединений .
Например, если вы хотите создать более продвинутую систему, которая учитывает некоторые ограничения этой системы, вы можете создать собственную программу проверки соединений.
,Проверки соединений ограничивают, какие соединения (и, следовательно, блоки) могут соединяться друг с другом.
Проверки соединений полезны для типов моделирования. Например, следующие три блока не имеют никакой связи между собой, поскольку они представляют собой код, возвращающий разные типы:
Проверки соединений можно использовать для предотвращения соединения этих блоков. Это дает пользователям мгновенную обратную связь и предотвращает множество простых ошибок.
Как они работают
Каждое соединение может быть связано с «проверкой соединения», которая представляет собой массив строк, допускающий значение NULL.
Два соединения могут соединиться, если:
- Это совместимые типы (например, выход, соединяющийся со входом).
- У них есть хотя бы одна общая строка в проверке соединения.
Например, соединения со следующими двумя проверками могут соединяться, поскольку они используют общую строку '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_value_block',
'output': 'a connection check entry',
},
{
'type': 'custom_statement_block',
'nextStatement': null, // null check
'previousStatement': ['four', 'connection', 'check', 'entries']
}
Для входных данных вы можете назначить проверку свойству check
определения входных данных. Если свойство check
не существует, проверка считается null
. Назначаемое вами значение может быть строкой или массивом строк.
{
'type': 'custom_block',
'message0': '%1 %2',
'args0': [
{
'type': 'input_value',
'check': 'a connection check entry' // Accepts custom_value_block
},
{
'type': 'input_statement',
'check': ['two', 'entries'] // Accepts custom_statement_block
}
]
}
JavaScript
Для соединений верхнего уровня вы можете передать проверку непосредственно методу, определяющему соединение. Если вы не передадите значение, проверка считается null
. Передаваемое вами значение может быть строкой (которая становится единственной записью при проверке соединения) или массивом строк.
Blockly.Blocks['custom_value_block'] = {
init: function() {
this.setOutput(true, 'a connection check entry');
}
};
Blockly.Blocks['custom_statement_block'] = {
init: function() {
this.setNextStatement(true); // null check
this.setPreviousStatement(true, ['four', 'connection', 'check', 'entries']);
}
};
Для входных данных вы можете передать проверку методу setCheck
после того, как вы определили входные данные. Если метод setCheck
не вызывается, проверка считается null
. Значение, которое вы передаете, может быть строкой или массивом строк.
Blockly.Blocks['custom_block'] = {
init: function() {
this.appendValueInput('NAME')
.setCheck('a connection check entry'); // Accepts custom_value_block
this.appendStatementInput('NAME')
.setCheck(['two', 'entries']); // Accepts custom_statement_block
}
};
Встроенные проверочные строки
Встроенные блоки имеют проверки соединения со значениями 'Array'
, 'Boolean'
, 'Colour'
, 'Number'
и 'String'
. Если вы хотите, чтобы ваши блоки взаимодействовали со встроенными блоками, вы можете использовать эти значения, чтобы сделать их совместимыми.
Ограничения
Эта система довольно надежна и может решить множество вариантов использования, но у нее есть несколько ограничений.
Ограничить более широкий контекст
Эта система сама по себе не поддерживает ограничение «большого контекста», в котором разрешено соединение. Например, вы не можете сказать, что блоку 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());
}
}
Но если подключенный блок также является универсальным, это работает неправильно. В этом случае нет хорошего решения.
Проверка соединений
Если эта система не подходит для вашего варианта использования, вы также можете изменить способ сравнения проверок соединений, создав собственную программу проверки соединений .
Например, если вы хотите создать более продвинутую систему, которая учитывает некоторые ограничения этой системы, вы можете создать собственную программу проверки соединений.