1 个不稳定版本
0.1.0 | 2023 年 11 月 14 日 |
---|
#2299 在 Rust 模式
12KB
274 行
number-types
一个原始类型,尽管略有改进,是为了更熟悉类型系统而制作的 typenum 包的重新创建。
相对于 typenum 的改进
它使用自己的特性和类型,而不是实例。永远不会创建任何实例。
基本上就是这些,其他的东西可能更差。这只是为了娱乐。
如何使用它
有几个宏,用于更轻松地构建表达式。它们始终以相同的顺序执行操作:type_expr!(<a> * <b> + <c> - <d>)
将执行 (a * (b + (c - d)))
。很奇怪,但这不是我的选择。我只是不想花那么长时间在宏上。
有 Z0..Z10 和 Z100 这样的类型,以及每个类型的负数对应项 (ZN...)。要自己构建操作,请使用 <Op<Lhs, Rhs> as OpKindOp>::Output
(OpKind 应为 Add、Mul 或 Sub)。要取一个数的相反数,请使用 <N as Neg>::Output
。
您可以使用 assert_type_eq!(a, b) 来断言类型相等。
它如何工作
所有数字都是围绕 Zero 的 N 层 Successor 包装。负数也在最顶层获得一个 Negative 包装。
加法基本上是这样做的
- 如果 Lhs 是 Zero,则 Output = Rhs 并返回。
- 否则,展开一层,重复第一步,将结果包裹在一层中,然后返回它。
减法是这样做的
- 如果 Rhs 是 Zero,则 Output = Lhs。
- 如果 Lhs 是 Zero,则 Output = Negative
。 - 否则,在两侧展开一层,然后再次尝试。
这包括了一些处理负数的案例(因为它们可能会将减法变成本质上相当于加法),但这里不会对这些案例进行解释。
乘法是重复加法。
你知道你可以进行类型匹配吗?
impl<A: Constr, B: Constr, O> TraitA<B> for SomeWrapper(A)
where
SomeOtherOrSameWrapper(A): TraitB<B, Output = O>
{
type Output = O;
}
:3