1个不稳定版本
0.1.0 | 2020年9月24日 |
---|
#2326 in Rust模式
22KB
443 行
type-vec:Rust中具有类型级别长度的类型安全向量
用法
在您的Cargo.toml
中包含该包。
type-vec = "0.1"
功能
类型安全的向量类型
该向量类型具有类型级别长度,该长度可以是动态的或静态的。也就是说,长度可以在编译时给出,或者仅在运行时知道。
use type_vec::{Vect, Dyn};
use typenum::consts::*; // imports U0
// vector with static length
let vec = Vect::<usize, U0>::new();
// vector with dynamic length
let vec = Vect::<usize, Dyn>::new();
类型推断和类型检查的向量操作
该向量支持常见的操作,例如push
、pop
和insert
。每个向量操作的输出长度在编译时推断。因此,您可以通过类型安全来避免常见的错误。
use type_vec::Vect;
use typenum::consts::*;
let vec = Vect::<usize, U0>::new();
let vec: Vect<usize, U1> = vec.push(3);
let vec: Vect<usize, U2> = vec.push(1);
// This line does not compile due to incorrect output length assumption.
/* let vec: Vect<usize, U2> = vec.push(1); */
// You can omit the type annotation and leave it to compiler
let (vec, item) = vec.pop();
let (vec, item) = vec.pop();
// This line causes compile error because we cannot pop an empty vector.
/* let vec = vec.pop(); */
零抽象和高效实现
该设计保证了零抽象。只要在编译时知道长度,它会选择更有效的实现。让我们看看使用get访问元素。如果索引是静态的,则索引在编译时与长度进行比较,如果编译成功,则直接返回元素。否则,它返回一个像通常的[Vec]那样的Option<&T>
。
use type_vec::Vect;
use typenum::consts::*;
let vec = Vect::<usize, U0>::new();
let vec: Vect<usize, U1> = vec.push(3);
let vec: Vect<usize, U2> = vec.push(1);
let vec: Vect<usize, U3> = vec.push(4);
// get element by static index
// the index is checked in compile time and returns the element directly
let elem = vec.get(U1::new());
assert_eq!(elem, &1);
// get element by dynamic index
// it returns an `Option` depending on the index
let elem = vec.get(1);
assert_eq!(elem, Some(&1));
工作原理
向量类型的构造在很大程度上依赖于TYP类型级编程语言。它通过简单的Rust语法实现了复杂的类型级计算。有兴趣的人可以阅读TYP书籍。
授权
MIT授权。请参阅授权文件。
依赖关系
~3.5MB
~72K SLoC