3 个不稳定版本
0.1.0 | 2023 年 12 月 9 日 |
---|---|
0.0.2 | 2023 年 11 月 28 日 |
0.0.1 | 2023 年 11 月 28 日 |
#814 in 游戏开发
29KB
499 代码行
stringid
《stringid》包是一组助手(宏、结构体、特质),用于高效地管理作为人类可读字符串和唯一数字的标识符。它可以用于使用直到应用程序结束才存在的不可变字符串。
唯一标识符允许轻量存储 + 快速比较和复制操作。而人类可读字符串则方便在 UI、序列化、调试等方面使用。
为什么使用 StringId
?
您可以在希望使用不可变 String
(或 [str
]) 作为标识符的地方使用 StringId
。尤其是如果这个标识符在数据中使用了多个地方。使用 StringId
的两个优点是:
- 它不会复制字符串数据。
- 它不使用字符串进行比较、分配、复制 Id。
⚠ 警告
使用 StringId
与 StaticStrStore
可以(安全地)泄漏内存。为 str
分配的内存将不会在程序结束前释放,就像一个 'static
变量。因此,如果您预计标识符(String
/str
)将经常更改,则可能应避免使用 StringId
与非不可变 String
,或者有意识地这样做。
典型用途可以是:
- 标签。
- 跨资源引用,特别是如果您需要序列化/反序列化数据。
技术设计
《StringId》变量仅存储标识符(一个唯一的数字)。而 [str
] 存储在单独的位置,每个 Id 的所有副本只占用内存一次,并通过专用类型进行访问。
《stringid》组件设计用于与新类型模式一起使用。因此,通过模块 macros
提供了一些宏,以帮助定义自定义类型。
为了存储 StringId
与相应的 [str
] 之间的对应关系,可以使用 StrLookup
的实现。 StrLookupHashMap
使用 std::collections::HashMap
和 StaticStrStore
实现 StrLookup
。
更多详细信息,请参阅相关文档。
快速入门
use std::{mem::size_of, str::FromStr};
use stringid::macros::{strlookup_hashmap, StringIdImpl};
use stringid::{create_hash_map, BufferStrStore, StringId};
// Create a struct type `CustomIdLookup`
// as a `str` lookup with `BufferStrStore` as StrStore.
#[strlookup_hashmap(key = u32, store = BufferStrStore)]
struct CustomIdLookup;
// Create a `StringId` type who use the type `CustomIdLookup`
// as `StrLookup`.
#[derive(Debug, Clone, Copy, StringIdImpl)]
struct CustomId(StringId<u32, CustomIdLookup>);
// Create instances of CustomId from str
let id_1 = CustomId::from_str("Id1").unwrap();
let id_2 = CustomId::from_str("Id2").unwrap();
let id_1_bis = id_1;
let id_1_ter = CustomId::from_str("Id1").unwrap();
// CustomId size is the size of the Id (u32 here)
assert_eq!(size_of::<u32>(), size_of::<CustomId>());
// The Id1 and Id2 are not equal
assert_ne!(id_1,id_2);
// But the id_1 and id_1_bis are
assert_eq!(id_1,id_1_bis);
// as well as id_1 and id_1_ter
assert_eq!(id_1,id_1_ter);
许可证:LGPL-3.0-only
依赖项
~190–320KB