为什么只能用特征指定类型限制?

Why can you only specify type restrictions with traits?

在Rust中只能使用traits来指定类型限制,例如:<T: A + B>,A和B必须是traits,不能是i32f64这样的原始类型.

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);
}

您可以通过为 原语实现特性 来解决这个问题,但是为什么语言的设计者不允许您使用原语作为限制?

因为用类型指定类型限制没有意义。


使用泛型编程的根本原因是允许多个具体类型。这就是为什么要表达 bounds,并且可以使用满足这些边界的任何类型。

如果您希望使用具体类型,当然可以...但不能使用泛型函数;你只需要使用一个常规函数。


请注意,边界是 加法 ,也就是说,当指定 T: X + Y 时,您并不是说期望任何实现 X 或 Y 的类型,而是您想要一个同时实现 X 和 Y 的类型。这里的 + 是一个 intersection.

结果:

  • 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);
}

注意:如果 public.

,其他人可能会为自己的类型实现您的特征