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

时间:2016-11-04 00:45:46

标签: rust language-design

在Rust中,您只能使用特征来指定类型限制,例如:<T: A + B>,A和B必须是特征,它们不能是基本类型,如i32f64。< / 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);
}

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

1 个答案:

答案 0 :(得分:5)

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

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

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

请注意,边界是 additive ,也就是说,在指定+时,您并不是说任何实现EITHER X OR Y的类型都是预期的,但是您想要一个实现BOTH的类型X和Y. T: i32这里是交叉点

结果:

  • i32没用,只需指定T: i32 + f32作为类型
  • 即可
  • i32是非感性的,没有类型同时为f32trait MyTrait: std::fmt::Display {} impl MyTrait for i32 {} impl MyTrait for f32 {} fn hello<T: MyTrait>(t: &T) { println!("{:?}", t); }

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

{{1}}

注意:如果公开,其他人可能会为自己的类型实施您的特质。