11个版本 (2个稳定版)
| 1.0.1 | 2024年5月2日 |
|---|---|
| 0.9.0 | 2024年4月22日 |
| 0.4.0 | 2023年10月7日 |
#450 在 Rust模式
每月803次下载
39KB
342 行
一个动态向量,可以存储任何单一类型的元素。
用法
UniVec 是一个动态向量,它封装了任何 Vec<T> 以存储在运行时确定的任何单一类型。其主要用途是在需要存储单个类型的元素,但此类型可能因上下文而异的情况下。
类型 T 在首次插入类型 T 的元素后与 UniVec 的一个实例相关联。一旦设置了类型,后续的所有插入都必须是同一类型。
它包含push/pop API,以实现高效的栈功能。
示例
# use univec::{UniVec, univec};
# use std::collections::HashMap;
let mut things = HashMap::<String, UniVec>::new();
things.insert("integers".to_string(), univec![1, 2, 3]);
things.insert("names".to_string(), univec!["foo", "bar", "baz"]);
assert_eq!(things["integers"].get::<i32>(0), Some(&1));
assert_eq!(things["names"].get::<&str>(0), Some(&"foo"));
便捷功能
此包重新导出 IntoIndex 特征,可以将任何整数类型转换为 usize。
这反过来被 At 特征用于提供 at() 和 at_mut() 方法,这些方法可以用来通过任何整数类型访问 UniVec 和 Vec 的元素。
性能
UniVec 是 Vec<T> 的 dyn 特征包装。大多数操作只是对底层 Vec 的单层间接引用。因此,UniVec 的性能应接近 Vec。
限制
- 由于它基于
std::any::Any引用,存储对象中包含的引用必须具有'static生命周期。 - 由于结果类型仅在运行时才知,因此没有为
UniVec实现Index和IndexMut特征。相反,使用At特征的at()和at_mut()方法。
趣味事实
这个仓库是一个使用ChatGPT和Codepilot进行代码和文档生成的测试平台。尽管如此,所有代码都经过了人工审计,并使用miri和cargo mutants进行测试。
贡献
欢迎贡献!请随意提交问题或发送pull request。
致谢
- FSMaxB -- 辅助特质实现想法。
依赖项
~265–720KB
~17K SLoC