Rust中,在struct定义中使用范型的方法,是在struct名称后跟<范型标识符>,例如:

struct Int<T> 

而在struct的方法的定义中使用范型,则是形如:

impl<T> Int<T> 

注意这里有两个范型标识符<T>

impl后面的<T>并不是可有可无的,如果其后有<T>,则后面struct名字后面的<T>才会被编译器认为是范型,否则编译器它是一个具体类型。

Rust使用这种方式可以来实现对一个范型的不同具体类型定义不同的方法的功能。

如下面的代码所示,x方法为所有Int实例所共有,但x32方法和x64方法则分别仅为具体类型为i32和i64的Int实例所有:

struct Int<T> {
    x: T,
}
impl<T> Int<T> {
    fn x(&self) -> &T {
        &self.x
    }
}
impl Int<i32> {
    fn x32(&self) -> &i32 {
        &self.x
    }
}
impl Int<i64> {
    fn x64(&self) -> &i64 {
        &self.x
    }
}
fn main() {
    let p = Int { x: 5};
    println!("p.x = {}", p.x());
    println!("p.x32 = {}", p.x32());
    //下面的注释掉的是错误语句
    //println!("p.x64={}", p.x64());
    let p2 = Int {x: 5i64};
    println!("p2.x = {}", p2.x());
    //下面的注释掉的是错误语句
    //println!("p2.x32 = {}", p2.x32());
    println!("p2.x64 = {}", p2.x64());
}