3 个版本
0.1.4 | 2023 年 12 月 30 日 |
---|---|
0.1.3 | 2023 年 12 月 26 日 |
0.1.2 | 2023 年 12 月 26 日 |
600 在 数据结构 中
17KB
153 行
钱包:Rust 中的钱包数据结构实现
概述
Purse 在 Rust 中实现了一个钱包,也称为多重集,但这个名字比较无聊。钱包是非常灵活的结构,允许存储异构和非唯一的项集合,支持不同类型并允许重复。
关键特性
- 灵活性:可以包含任何项,具有重复项和不同类型。
- 混合集合:适用于需要混合不同类型的应用程序。
- 重复处理:允许同一项的多个实例。
安装
cargo add purse
使用
use std::any::TypeId;
use purse::Purse;
let mut purse = purse::new();
purse.insert("hello");
purse.insert(42);
assert!(purse.contains("hello"));
assert!(purse.contains(42));
assert_eq!(purse.count::<&str>(), 1);
// Get all of type.
let strings: Vec<&&str> = purse.get_all_of_type();
assert_eq!(strings.len(), 4);
purse.insert("foo");
purse.insert("bar");
purse.insert("baz");
assert!(strings.contains(&&"foo"));
assert!(strings.contains(&&"bar"));
assert!(strings.contains(&&"baz"));
// Check the most common type.
assert_eq!(purse.most_common_type(), Some(TypeId::of::<&str>()));
// Clearing the bag.
purse.clear();
assert!(purse.is_empty());
// Add a few items again.
purse.insert(5);
purse.insert("foo");
// Iteration over all elements in the bag
let mut nums: Vec<i32> = vec![];
let mut strs: Vec<&str> = vec![];
purse.iter().for_each(|item| {
if let Some(&t) = item.downcast_ref::<i32>() {
nums.push(t);
} else if let Some(&t) = item.downcast_ref::<&str>() {
strs.push(t);
} else {
panic!("unexpected type found in bag");
}
});
assert_eq!(nums.first(), Some(&5));
assert_eq!(strs.first(), Some(&"foo"));
贡献
欢迎贡献!请遵循 Rust 请求的标准约定。
许可证
本项目受以下任一许可证的许可:
- Apache 许可证 2.0 版(licenses/Apache-2.0)
- MIT 许可证(licenses/MIT)
任选其一。
本项目的 SPDX 许可证标识符为 MIT OR Apache-2.0。