0.1.0 |
|
---|
#19 in #保存
97KB
2K SLoC
Rust 对象格式 (.rof)
Rust 对象格式允许将 Rust 对象序列化为与原始对象非常相似的文本格式。它还允许在不同编程语言之间轻松传输对象,因为对象可以在它们各自的语言中创建,序列化为字符串,发送到另一个语言,反序列化并再次使用。
TL;DR:一个可以将 Rust 对象序列化和反序列化为字符串的库,允许简单地将 Rust 对象在分离的编程语言之间保存和传输。
目录
设计目标
- 人类可读(易于编写,支持内联注释,且文件为文本格式)
- 在 Rust 中序列化和反序列化时无需任何转换
- 对于熟悉 Rust 的人来说易于理解
- 受 JSON 启发,作为与另一种语言的数据结构紧密相似的语言
- 丰富的内置数据类型,例如枚举、元组、选项、数组、哈希表等
用例
- 保存和加载数据
- 轻松在之间共享数据
语言
结构体
由一对大括号包围
{
title: string = "Ferris the crab";
}
每个对象属性的定义如下,并且总是以分号结束。
- 显式类型注解
属性名: 属性类型 = 属性值;
- 隐式类型注解(仅允许在类型注解可选的类型上使用)
属性名 = 属性值;
简单属性类型
简单属性类型仅包括基本类型
布尔类型
- 假值布尔 >
false
- 真值布尔 >
true
类型注解可选,可以隐式指定
is_swimming: bool = false;
文本类型
- 字符串 >
"string"
(严格需要双引号) - 字符 >
'c'
(严格需要单引号)
类型注解可选,可以隐式指定
数字类型
所有整数类型值均以相同方式编写
- u8(8位无符号整数)>
year: u8 = 2023;
- 8位有符号整数(i8) >
distance: i8 = -32;
- 16位无符号整数(u16) >
year: u16 = 2023;
- 16位有符号整数(i16) >
distance: i16 = -32;
- 32位无符号整数(u32) >
year: u32 = 2023;
- 32位有符号整数(i32) >
distance: i32 = -32;
- 64位无符号整数(u64) >
year: u64 = 2023;
- 64位有符号整数(i64) >
distance: i64 = -32;
- 128位无符号整数(u128) >
year: u128 = 2023;
- 128位有符号整数(i128) >
distance: i128 = -32;
- 平台相关无符号整数(usize) >
year: usize = 2023;
- 平台相关有符号整数(isize) >
distance: isize = -32;
所有浮点类型值的表示方法相同
- 32位浮点数(f32) >
temperature: f32 = 5.3;
- 64位浮点数(f64) >
weight: f64 = 7;
(与Rust不同,浮点数不能严格包含小数点,在Rust中这将被写作7.
或7.0
)
类型注解是强制的,不能隐含指定
复杂属性类型
一个复杂/组合属性包括一个基本类型以及x个子类型,这些子类型可以是简单和复杂属性类型的组合
元组和数组
- 元组 >
position: tuple<f64, f64, f64> = (3, 5.4, 7);
如果元组参数类型是可选的,则类型注解是可选的
- 数组 >
pet_names: array<string> = ["Archie", "Charlie", "Luna", "Milo", "Rocky"];
如果数组对象类型是可选的,则类型注解是可选的
结构体和哈希表
- 哈希表
passwords: hashmap<u16, string> = {
739341: "abc123",
210405: "football32",
826135: "dragon97"
};
如果哈希表键和值对象类型是可选的,则类型注解是可选的
- 结构体
passwords = {
739341: string = "abc123",
"210405": string = "football32",
826135: enum<string> = None;
};
哈希表和结构体不能互换,因为它们之间存在一些关键区别
- 结构体属性索引名称必须是字符串,而哈希表键可以是任何类型的值作为键。
- 哈希表键必须都是同一类型,而结构体则需要显式注解每个属性的类型。
类型注解是强制性的;如果您希望数据作为哈希表加载,则必须将值注解为哈希表,否则它将作为结构体加载,反之亦然。
枚举
- 枚举 >
action: enum = IDLE;
- 枚举 >
action: enum = SLEEPING;
-
枚举 >
action: enum<f64> = JUMP(3.6);
-
枚举 >
action: enum<f64, f64> = RUN(50, 31.2);
-
枚举 >
action: enum<string> = EAT("Hamburger");
-
在Rust中的相同枚举
enum action {
IDLE,
SLEEPING,
JUMP(f64 /* jump power */),
RUN(f64 /* x-velocity */, f64 /* y-velocity */),
EAT(String /* food item */),
}
如果枚举参数类型是可选的,则类型注解是可选的
关键字 "option" 也可以用来替代 "enum",并且与 "enum" 关键字的工作方式完全相同;当使用选项枚举时,可以使用 "option" 关键字代替 "enum",使其更易于阅读。对于任何其他枚举类型,"option" 关键字都可以正常工作,但强烈建议不要使用。
格式化
{
title: string = "Ferris the crab";
age: usize = 25;
favourite_color: enum = ORANGE;
accessories: array<enum<usize>> = [
SUNGLASSES(3),
GOLDEN_SHOES(1)
];
}
-
制表符是推荐的,但不是强制的,并且期望每个嵌套值从根对象开始有一个制表符级别
-
推荐使用蛇形属性索引,但不是强制的
-
换行符是推荐的,但不是强制的,并且期望在每个对象的第一个字符之后以及每个属性之后(在分号之后)进行换行
Rust库文档
JavaScript库文档
依赖关系
~265–710KB
~17K SLoC