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

Jon*_*low 0 language-design rust

在Rust中,您只能使用特征来指定类型限制,例如:<T: A + B>,A和B必须是traits,它们不能是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);
}
Run Code Online (Sandbox Code Playgroud)

你可以通过实现原语的特征解决这个问题,但为什么语言的设计者不会让你使用原语作为限制呢?

Mat*_* M. 5

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


使用泛型编程的原因是允许多种具体类型.这就是您表达边界的原因,并且可以使用满足这些边界的任何类型.

如果你想使用一种具体的类型,你当然可以...但不具备通用功能; 你只需使用常规功能.


请注意,边界是添加剂,也就是说,在指定时T: X + Y并不是说任何实现EITHER X OR Y的类型都是预期的,而是你想要一个实现BOTH X和Y的类型.+这里是一个交集.

结果是:

  • T: i32没用,只需指定i32类型即可
  • T: i32 + f32是非感性的,没有类型是同一类型的a i32和af32

那么......你如何指定OR关系?通过使用特性!

trait MyTrait: std::fmt::Display {}

impl MyTrait for i32 {}
impl MyTrait for f32 {}

fn hello<T: MyTrait>(t: &T) {
    println!("{:?}", t);
}
Run Code Online (Sandbox Code Playgroud)

注意:如果是公共的,其他人可能会为自己的类型实现您的特征.

  • 另一个注意事项:如果您(OP或未来的读者)只需要任何数字类型的泛型,请使用`num` crate中的`Num`特征. (2认同)