在 Rust 中你只能使用 traits 来指定类型限制,例如:<T: A + B>
, A 和 B 必须是特征,它们不能是像 i32
这样的原始类型或 f64
.
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);
}
您可以通过为原语实现特征来解决这个问题,但是为什么语言的设计者不允许您使用原语作为限制?
最佳答案
因为用类型指定类型限制没有意义。
使用泛型编程的真正原因是允许多个具体类型。这就是为什么要表达边界,并且可以使用满足这些边界的任何类型。
如果您希望使用具体类型,您当然可以……但不能使用泛型函数;您只需使用常规函数即可。
请注意,边界是加法,也就是说,当指定 T: X + Y
时,您并不是说任何实现 X 或 Y 的类型都是预期的,但是您想要一个同时实现 X 和 Y 的类型。这里的 +
是一个交集。
结果:
T: i32
没用,指定i32
为类型即可T: i32 + f32
是无意义的,没有类型既是i32
又是f32
在同一类型
那么……如何指定OR关系呢?通过使用特征!
trait MyTrait: std::fmt::Display {}
impl MyTrait for i32 {}
impl MyTrait for f32 {}
fn hello<T: MyTrait>(t: &T) {
println!("{:?}", t);
}
注意:如果您的特征是公开的,其他人可能会为他们自己的类型实现您的特征。
关于rust - 为什么只能用特征指定类型限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40413615/