#length #type-level #vec #cargo-toml #complex #done #rusty

type-vec

具有类型级别长度的类型安全向量

1个不稳定版本

0.1.0 2020年9月24日

#2326 in Rust模式

MIT授权

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();

类型推断和类型检查的向量操作

该向量支持常见的操作,例如pushpopinsert。每个向量操作的输出长度在编译时推断。因此,您可以通过类型安全来避免常见的错误。

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