跳转至

类型

在插件开发中,如果仅处理数字,通常不会遇到与数据类型相关的问题。 然而,当涉及到文本和列表时,对数据类型的理解就变得至关重要。

数据类型

在 Blockly(及其编译为 C# 的代码)中,所有值都具有明确的数据类型。主要有以下四种类型:

Blockly 类型 C# 类型 描述
Number int / double 整数或浮点数。
String string 文本字符串,即字符的有序序列。
Boolean bool 布尔值,表示“真”或“假”。
Array List<dynamic> 列表,包含其他类型值的集合。

值得注意的是,即使外观相似,不同类型的数据在底层是完全不同的。例如,字符串 "123" 是字符 '1', '2', '3' 的序列,而数字 123 代表数值一百二十三。同样,字符串 "True" 是字符序列,而布尔值 True 代表逻辑上的“真”。

BVE 接口值类型

与 BVE 交互时,大多数接口(除应答器距离外)仅接受和返回整数类型。无论是设置面板、声音状态还是操作手柄,都必须使用整数。如果提供浮点数,它将被自动取整。这意味着小数无法直接传递给游戏内变量(如 ats.xxpluginState[x])。一种变通方法是在插件内部将数值放大特定倍数,然后在 Panel 或 Animated 文件中再将其缩小相应倍数。

配置文件 (INI) 值类型

  • 如果INI文件中的值为纯数字,它将被解析为 Number 类型。
  • 如果值为 truefalse (不区分大小写),它将被解析为 Boolean 类型。
  • 在其他所有情况下,值都将被解析为 String 类型。

类型转换

要将一种类型的值转换为另一种,请使用“其他”分类中的“转文本”、“转数字”和“转布尔值”逻辑块。 这些逻辑块在内部调用了 C# 的 Convert.ToStringConvert.ToDoubleConvert.ToBoolean 函数。

  • 转数字: 将数字字符串转换为其对应的数值。布尔值 True 转为 1False 转为 0。转换非数字字符串会引发运行时错误。
  • 转布尔值: 将数字 0 转为 False,其他数字转为 True。字符串 "True""False" (不区分大小写) 会被转换为对应的布尔值。转换其他字符串会引发运行时错误。
  • 转文本: 将数字和布尔值转换为其字符串表示形式 ("True", "False")。此操作无法直接应用于列表以获取其内部值。

警惕类型不匹配

将不兼容的类型混合使用(例如,对数字和文本执行数学运算,或将文本赋值给需要数字的面板状态)将导致运行时错误。

在大多数情况下,Blockly 内置的类型检查系统会通过形状匹配来阻止不同类型的逻辑块拼接,从而避免这类错误。然而,对于变量、列表项和INI配置项,由于它们的类型是动态的,类型检查无法在编译前提供保护。如果在运行时这些值的类型与预期不符,就会发生错误。

  • 对于变量,请务必跟踪并确保为其赋以正确类型的值。
  • 对于INI配置项,请确保配置文件编写正确,或在代码中使用前进行显式类型转换。

错误场景示例及解决方案

假设我们需要开发一个插件,使一个面板状态在一系列预设值之间循环。

逻辑块代码: Blockly Code

loop.ini 配置文件:

[loop]
values = 1, 3, 4, 7, 5, 6
id = 5
interval = 1000

根据INI文件的解析规则,values 会被解析为字符串 String,而 idinterval 会被解析为数字 Number。 代码中,我们提取了列表中的第 display + 1 个元素(因为 Blockly 列表索引从 1 开始)。

这段代码可以通过编译。然而,在运行时,我们会遇到一个错误,提示无法将 string 转换为 int。问题出在哪里?

Runtime Error

当以 , 分割字符串 values ("1, 3, 4, 7, 5, 6") 时,我们得到的是一个 字符串列表 (["1", "3", "4", ...])。因此,当我们获取其中一个元素时(例如第一个元素,字符串 "1"),它的类型是 String 而不是 Number。由于面板状态变量只能接受整数,尝试用字符串为其赋值便引发了类型转换错误。

解决方案: 明确问题后,只需在获取列表元素后添加一个“转数字”逻辑块即可解决问题。 Solve Error

另一种更优的实践是,在插件加载时,通过循环提前将列表中的所有项目都转换为正确的数字类型。