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)
你可以通过实现原语的特征来解决这个问题,但为什么语言的设计者不会让你使用原语作为限制呢?
因为使用类型指定类型限制没有意义.
使用泛型编程的原因是允许多种具体类型.这就是您表达边界的原因,并且可以使用满足这些边界的任何类型.
如果你想使用一种具体的类型,你当然可以...但不具备通用功能; 你只需使用常规功能.
请注意,边界是添加剂,也就是说,在指定时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)
注意:如果是公共的,其他人可能会为自己的类型实现您的特征.