title: 创建自定义块 - 类型检查
Type Checks
<原文地址:https://developers.google.com/blockly/guides/create-custom-blocks/type-checks
Blockly建模动态类型语言(如JavaScript或Python)。它缺少静态类型语言(如Java或C ++)的严格规则。更具体地说,任何值都可以赋给任何变量,在变量定义中没有int,bool或float。
然而,Blockly确实有能力防止一些没联系(non-sensical combinations )组合的构建。以下三个块没有业务相互连接:
![](https://img.haomeiwen.com/i2433593/ab2461633ade1543.png)
每个Blockly的连接类型(值输入/输出,下一个/上一个语句)都可以用类型信息标记,以使明显无效的连接将拒绝连接。这给用户即时的反馈,并避免许多简单的错误。
值输入和输出
让我们从一个数字块开始。当指定输出时,也可以设置类型字符串。因为这个块应该返回一个数字,让我们将输出类型设置为字符串'Number':
json
{
"type": "math_number",
// ...
"output": "Number",
}
js
Blockly.Blocks['math_number'] = {
init: function() {
// ...
this.setOutput(true, 'Number');
}
};
![](https://img.haomeiwen.com/i2433593/d987728b5f3bb201.png)
更复杂的块是确定数字是否为偶数的数学块。这个块有一个期望一个数字的输入,和一个返回一个布尔的输出。这里是指定这样的代码:
json
{
"type": "math_number_property",
// ...
"args0": [
// ...
{
"type": "input_value",
"name": "NUMBER_TO_CHECK",
"check": "Number"
}
],
"output": "Boolean"
}
js
Blockly.Blocks['math_number_property'] = {
init: function() {
// ...
this.appendValueInput('NUMBER_TO_CHECK').setCheck('Number');
this.setOutput(true, 'Boolean');
}
};
![](https://img.haomeiwen.com/i2433593/4248d29804ffcdbd.png)
当数字块连接到此数学块时,两个连接的类型都为“Number”,因此连接成功。而如果一个人试图将一个文本块(输出类型为'String')插入数学块,那么这两种类型将不匹配,并且连接将拒绝连接。
“ength of”类似,除了它需要能够接受文本块或列表块。因此,不是一个字符串,它的输入类型被设置为两个选项的数组:
json
{
"type": "text_length",
// ...
"args0": [
// ...
{
"type": "input_value",
"name": "VALUE",
"check": ["String", "Array"]
}
],
"output": "Number"
}
js
Blockly.Blocks['text_length'] = {
init: function() {
// ...
this.appendValueInput('VALUE').setCheck(['String', 'Array']);
this.setOutput(true, 'Number');
}
};
![](https://img.haomeiwen.com/i2433593/6433533aeebb3742.png)
块可以想象地返回两种或更多种类型中的一种。虽然在Blockly中没有当前的例子,但是通过将输出类型设置为类型数组来支持。如果输入中的任何单个类型与输出中的类型匹配,则可以连接块。
变量是可以保存任何类型的值块的示例。因此,它们的类型设置为null,表示通配符:
json
{
"type": "variable_get",
// ...
"output": null
}
js
Blockly.Blocks['variable_get'] = {
init: function() {
// ...
// Second parameter for type is optional, and null is the default.
this.setOutput(true);
}
};
![](https://img.haomeiwen.com/i2433593/50cc9da3efb2e589.png)
允许将块插入任何输入,而不管输入的类型。
请注意,Blockly('Number','Boolean','String','Array','Color')中使用的类型字符串是完全任意的。任何字符串都是可接受的,并且新的字符串可以是专门的。只是确保输出和输入之间的一致性。
语句堆栈
以与输入和输出的水平连接可以类型相同的方式,垂直语句堆栈也可以具有类型信息。大多数编码应用程序不会使用此功能,因为任何语句通常可以遵循任何其他语句。
![](https://img.haomeiwen.com/i2433593/ef1d4b9f438bfb09.png)
类型语句连接的一个罕见示例可以在Blockly开发工具的Block Factory选项卡中看到。注意,字段块可以不被堆叠在输入块应该去的地方,并且输入块可以不被堆叠在字段块应该去的地方。
有三个地方定义了类型化语句:一个块的上一个和下一个连接,以及一个语句输入的连接。它们定义块的顶部和底部的堆叠槽口,它们只能连接到其槽口未设置类型或其槽口包含至少一个匹配类型的块。
以下示例演示“Mouse”和“Rat”类型,其中可以将任一类型的块添加到语句输入RODENTS。然而,这个玩具例子不支持啮齿动物列表中的老鼠和鼠。
json
{
"type": "append_mouse",
"message0": "Mouse",
"previousStatement": "Mouse",
"nextStatement": "Mouse"
},
{
"type": "rodent_list",
"message0": "Rodents %1",
"args0": [
{
"type": "input_statement",
"name": "RODENTS",
"check": ["Mouse", "Rat"]
}
]
}
js
Blockly.Blocks['append_mouse'] = {
init: function() {
this.appendDummyInput().appendField('Mouse');
this.setPreviousStatement(true, 'Mouse');
this.setNextStatement(true, 'Mouse');
}
};
Blockly.Blocks['rodent_list'] = {
init: function() {
this.appendDummyInput().appendField('Rodents');
this.appendStatementInput('RODENTS')
.setCheck(['Mouse', 'Rat']);
}
};
![](https://img.haomeiwen.com/i2433593/9a6d9f5fad40cd3f.png)
网友评论