2个不稳定版本
0.2.0 | 2023年5月8日 |
---|---|
0.1.0 | 2023年5月8日 |
#1135 in Rust模式
29 下载/月
285KB
6K SLoC
Matr
Matr(在Rust中使用关联类型进行元编程,发音类似于"物质")是一个Rust的元编程库。
这是一个Rust元编程的标准库,提供基本类型和算法,但预期用户将定义自己的类型和元函数;元-"类型系统"旨在可扩展。
除了bool
和type
之外,这里定义的所有其他元类型(即src/
下的目录)都不访问用户使用此库所能访问之外的内容,因此它们也作为示例,供此库的用户了解如何编写自己的元类型。
还可以定义具有额外限制/功能的Kind
的自定义子特质,例如,请参阅EqualityComparableKind
和Equals
作为示例。
此库使用特质(特别是Expr<K>
)作为元值,以便Rust类型检查器可以检测元函数中的类型错误(例如,在应该返回Expr<USize>
的元函数中尝试返回Expr<Bool>
)。由于特质不能有特质参数(只有类型参数,可以通过特质进行约束),每个元类型都有一个关联的Kind
结构(例如,布尔值对应于Bool
)。
在撰写本文时(2023年3月),这仍然是一个正在进行中的工作,并且由于使用了#![feature(specialization)]
和#![feature(const_trait_impl)]
(尚未稳定),因此需要rustc的nightly版本。
这不是一个官方支持的Google产品。
为什么不用const fn
进行元编程?
如果您的用例由 const fn
覆盖,那么使用这些比使用这个更简单。然而,const fn
无法计算类型;如果您正在寻找一个用于操作类型的库,那么您来到了正确的位置。
此库还提供了一个 ConstFn
元类型,允许在元计算的结果中也包含一个 const fn
。
这主要用于那些在计算类型和计算 ConstFn
之间存在共享逻辑的用例。如果您只需要 ConstFn
,那么这个库对于您的用例来说就过于强大了,您只需使用普通的 const fn
即可。
为什么不使用宏进行元编程呢?
如果您的用例由宏覆盖,那么使用这些比使用这个更简单。然而,宏只能访问 AST 而不能访问完整的类型信息(这可以通过此库实现)。