我想编写以下形式的通用函数
fn my_function<T: num::Unsigned>(T: number) -> T
Run Code Online (Sandbox Code Playgroud)
为了将它们用于所有无符号整数类型,所以u8- u128。然而,我经常想做一些类似的事情
let n = number + 1;
Run Code Online (Sandbox Code Playgroud)
或者
let mut n = number;
number -= 1;
Run Code Online (Sandbox Code Playgroud)
在函数体中。现在,每次我使用类似的东西时,Rust 都会告诉我 -trait std::ops::SubAssign、std::cmp::PartialOrd-trait 等并未针对T.
有没有一种简单的方法来指定我的号码只是其中一种类型u8-u128因此具有所有这些特征?为什么 Rust 编译器不清楚这一点,即Unsigned不具有PartialOrd-trait 的 -type 的示例是什么?
编辑:澄清一下:我想要的是一种方式来表达“T必须具有其中一种类型u8...... u128(也许BigUInt)”,然后让 Rust 自动看到“因为T是其中一种类型,所以以下特征具有实施对象T:std::cmp::PartialOrd, std::ops::SubAssign, ...”
反之,T: Unsigned 则表示T: One. Unsigned是 的超级特征,Num是 的超级特征Zero,One是 、 等的超级特征:
pub trait Unsigned: Num { }
pub trait Num: Zero + One + NumOps<Self, Self> + PartialEq<Self> { ... }
Run Code Online (Sandbox Code Playgroud)
要理解的关键是,这1与 不同T::one()。这适用于例如:
use num::Unsigned; // 0.4.0
fn my_function<T: Unsigned>(number: T) -> T {
number + T::one()
}
Run Code Online (Sandbox Code Playgroud)
该NumOps特征意味着定义了各种算术运算符,但仅在Ts 之间定义。字面意思1可能不是 a T,T可能是类似 的东西BigUint。
我想要的是一种方式来表达“
T必须具有其中一种类型u8......u128(也许BigUInt)”,然后让 Rust 自动看到“因为T是这些类型之一,所以必须实现以下特征T:std::cmp::PartialOrd、、std::ops::SubAssign……”
这不是特质的设计原理。特征可以在外部类型上实现,所以即使现在Unsigned只为这些类型实现,其他一些板条箱我也会为它们的类型实现它,这些类型不具有...的所有相同属性,等等。u8u128
相反,您应该限制 T拥有函数运行所需的属性。所以你必须明确。