在Rust中,您只能使用特征来指定类型限制,例如:<T: A + B>
,A和B必须是特征,它们不能是基本类型,如i32
或f64
。< / p>
trait Foo {}
impl Foo for i32 {}
fn blah<T: i32>(val: T) {
// ^^^ works if this is Foo
println!("hello\n");
}
fn main() {
let toast: i32 = 33;
blah(toast);
}
你可以通过为原语实现一个特征来解决这个问题,但为什么该语言的设计者不会让你使用原语作为限制呢?
答案 0 :(得分:5)
因为使用类型指定类型限制没有意义。
使用泛型编程的原因是允许多个具体类型。这就是你表达 bounds 的原因,并且可以使用满足这些边界的任何类型。
如果你想使用一种具体类型,你当然可以......但不能使用通用功能;你只需使用常规功能。
请注意,边界是 additive ,也就是说,在指定+
时,您并不是说任何实现EITHER X OR Y的类型都是预期的,但是您想要一个实现BOTH的类型X和Y. T: i32
这里是交叉点。
结果:
i32
没用,只需指定T: i32 + f32
作为类型i32
是非感性的,没有类型同时为f32
和trait MyTrait: std::fmt::Display {}
impl MyTrait for i32 {}
impl MyTrait for f32 {}
fn hello<T: MyTrait>(t: &T) {
println!("{:?}", t);
}
那么......你如何指定OR关系?通过使用特性!
{{1}}
注意:如果公开,其他人可能会为自己的类型实施您的特质。