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