1 个不稳定版本
0.1.0 | 2021年1月12日 |
---|
#2122 in 数据结构
24KB
143 行
数据溯源
一个Rust库,它提供了在插入时生成键的容器。这个键只能与生成它的映射一起使用。
使用库
将以下内容添加到您的 Cargo.toml
[dependencies]
provenance = "0.1.0"
示例
use provenance::ProvenanceMap;
fn main() {
let ages = ProvenanceMap::<u32>::new().unwrap();
let names = ProvenanceMap::<String>::new().unwrap();
let middle_age: Key<u32> = ages.insert(40); // Key generated on insert
assert_eq!(&40, ages.get(middle_age)); // Key is used to retrieve stored value
// names.get(middle_age); // Compile error, key can only be used with it's map
}
lib.rs
:
这个库提供了容器,其中键保证是有效的。键是在值被插入容器时生成的。该键仅保证与生成它的映射一起使用,并在该容器内始终引用相同的值。
use provenance::ProvenanceMap;
// A new map is easily created
let mut map = ProvenanceMap::<i32>::new().unwrap();
// Inserting a value into the map returns a key
let key = map.insert(5);
// That key is guaranteed to be able retrieve that value
assert_eq!(&5, map.get(key));
// Notice that the retrieved value is not wrapped in an Option or Result
使用未创建该键的映射的键是编译时错误
use provenance::ProvenanceMap;
let mut map1 = ProvenanceMap::<i32>::new().unwrap();
let mut map2 = ProvenanceMap::<bool>::new().unwrap();
let key = map1.insert(5);
map2.get(key); // Using a key generated by map1 with map2 is a compilation error
映射唯一性
为了能够保证只有由映射创建的键可以与该映射一起使用,每个映射和键都有一个类型参数,专门用来表示 provenance。然而,对于每个provenance,可能只有一个唯一的映射,因此创建映射可能会失败。
use provenance::ProvenanceMap;
// Creating a map is ok
let map = ProvenanceMap::<i32>::new();
assert!(map.is_some());
// Creating another with the same provenance is not
let map = ProvenanceMap::<i32>::new();
assert!(map.is_none()); // Creation failed and `None` were returned
轻量级键
这个库的映射生成的键是轻量级的,这意味着它们是可复制的。这意味着其他可复制的值可以链接到不可复制的值,而不用担心生命周期。
use provenance::{Key, ProvenanceMap};
use std::ops::Add;
struct Currency { name: String }
#[derive(Copy, Clone)]
struct Money { amount: i32, currency: Key<Currency> }
impl Add for Money {
type Output = Money;
fn add(self, rhs: Self) -> Self::Output {
Money {
amount: self.amount + rhs.amount,
currency: self.currency,
}
}
}
let mut currencies = ProvenanceMap::<Currency>::new().unwrap();
let sek = currencies.insert(Currency { name: "Swedish Krona".into() });
let mon1 = Money { amount: 5, currency: sek };
let mon2 = Money { amount: 10, currency: sek };
let sum = mon1 + mon2;
assert_eq!(sek, sum.currency);
assert_eq!("Swedish Krona".to_string(), currencies.get(sum.currency).name);
依赖关系
~10KB