不需要。
要使用参数化类型,您需要让trait定义您想调用的有效操作。 因此,您需要具有所有要调用的操作的一个或多个trait。
Rust中的“原始”类型并没有任何特殊之处。它们通过std::ops
的traits来定义它们的运算符(尽管显然使用编译器内部函数),就像任何“非原始”的数字类型一样。
实际上,“原始”和“非原始”数字类型之间的边界甚至有些模糊,因为对于缺乏FPU的目标,标准库可能会在代码中实现浮点类型,并且在Rust中,它可以对用户进行透明处理。
因此,实际上不存在基本数字类型。提供您需要调用的任何运算符来定义数字类型。因此,只需通过std::ops
traits限制您的类型即可。
最初的回答。
struct Struct<T>(T);
trait Printer {
fn print(&self);
}
impl Printer for Struct<i32> {
fn print(&self) {
println!("Printing for i32 value: {}", self.0);
}
}
fn main() {
let x = Struct(15_i32);
let _z = Struct(14.2_f64);
x.print();
//_z.print();//compile error
}
另外,您可以使用 Borrow<S>
特质作为技巧,您可以将泛型参数限制如下:(T: Borrow<S>
表示 T
可以被借用为 S
)。
impl<T> Printer for Struct<T>
where
T: Borrow<f64> + Debug,
{
fn print(&self) {
println!("Printing for f64 value: {:?}", self.0);
}
}
但是,由于您可以为任何类型实现Borrow<f64>
,因此这种限制可能不被视为严格。
此外,仅对于数字原语,您可以使用num-traits crate中的特征,例如ToPrimitive
和AsPrimitive
。