类型系统
类型
TEN 框架类型系统是 TEN 框架内用于定义值的数据类型的系统。开发者可以通过 TEN 模式声明消息或扩展属性的类型。
TEN 框架类型系统包括基本类型和复合类型。基本类型包括以下内容:
int8
8 位有符号整数。
int8_t
int8
int
int16
16 位有符号整数。
int16_t
int16
int
int32
32 位有符号整数。
int32_t
int32
int
int64
64 位有符号整数。
int64_t
int64
int
uint8
8 位无符号整数。
uint8_t
uint8
int
uint16
16 位无符号整数。
uint16_t
uint16
int
uint32
32 位无符号整数。
uint32_t
uint32
int
uint64
64 位无符号整数。
uint64_t
uint64
int
float32
单精度(32 位)IEEE 754 浮点数。
float
float32
float
float64
双精度(64 位)IEEE 754 浮点数。
double
float64
float
string
Unicode 字符序列。
std::string / char*
string
str
buf
8 位无符号字节序列。
uint8_t*
[]byte
bytearray / memoryview
bool
二进制值,true 或 false。
bool
bool
bool
ptr
指向内存地址的指针。
void*
unsafe.Pointer
复合类型包括以下内容:
array
相同类型的元素集合。
object
表示复杂的键/值对。键类型始终为字符串。
对于基本类型,可以使用 get_property()
/ set_property()
等方法访问或设置属性。例如:
对于复合类型,通常需要使用相关的序列化方法。例如:
类型和模式
如果指定了 TEN 模式,则将根据相应的 TEN 模式确定属性类型。如果未指定 TEN 模式,则将根据初始值赋值的类型确定属性类型。例如,如果初始赋值为 int32_t
,则属性类型为 int32_t
;如果使用 JSON 完成初始赋值,则将根据 JSON 处理规则确定类型。
转换规则
TEN 框架支持不同类型值之间的灵活自动转换。只要转换不会导致值丢失,TEN 框架将自动执行类型转换。但是,如果转换导致值丢失,例如将类型从 int32_t
转换为 int8_t
时,值超出了 int8_t
可以表示的范围,则 TEN 框架将报告错误。例如,对于 send_<foo>
操作,TEN 框架将返回一个错误。
安全且必须成功的转换
将较低精度类型转换为较高精度类型始终是安全的,并且保证成功,因为较高精度类型可以完全容纳较低精度类型的值而不会丢失数据。此自动转换称为安全转换。例如,当尝试将 int8
类型属性作为 int32
检索时,TEN 类型系统会自动将属性类型转换为 int32
。
在 TEN 类型系统中,安全转换规则如下:
在
int
类型中,从较低精度到较高精度。在
uint
类型中,从较低精度到较高精度。在
float
类型中,从较低精度到较高精度。
int8
int16 / int32 / int64
int16
int32 / int64
int32
int64
uint8
uint16 / uint32 / uint64
uint16
uint32 / uint64
uint32
uint64
float32
float64
例如:
不安全且可能失败的转换
将较高精度类型转换为较低精度类型是不安全的,因为较高精度类型的值可能超出较低精度类型的范围,从而导致数据丢失。此转换称为不安全转换。执行不安全转换时,TEN 运行平台会检查溢出。如果发生溢出,TEN 类型系统将抛出一个错误。
在 TEN 框架类型系统中,不安全转换规则如下:
将
int64
转换为较低精度的int
。将
int64
转换为任何精度的uint
。将
float64
转换为float32
。
int64
int8
[-2^7, 2^7 - 1]
int64
int16
[-2^15, 2^15 - 1]
int64
int32
[-2^31, 2^31 - 1]
int64
uint8
[0, 2^7 - 1]
int64
uint16
[0, 2^15 - 1]
int64
uint32
[0, 2^31 - 1]
int64
uint64
[0, 2^63 - 1]
float64
float32
[-3.4028234663852886e+38, 3.4028234663852886e+38]
重要的是要注意,TEN 运行平台仅在将 JSON 文档反序列化为 TEN 属性且 TEN 属性具有定义的 TEN 模式时才执行不安全转换。例如:
加载
property.json
时。对于整数,默认情况下它们将被解析为
int64
;对于浮点数,默认情况下它们将被解析为float64
。TEN 框架类型系统将根据上面提到的规则执行不安全转换。调用
set_property_from_json()
等方法时。当传递序列化的 JSON 字符串时,TEN 框架类型系统也将根据上面提到的规则执行不安全转换。
Last updated
Was this helpful?