跟着谷歌学习Rust:第十课-泛型

74 阅读1分钟

泛型是每个语言实现抽象的基本功能,要在语言中实现抽象那么泛型必不可少。

泛型的含义: 在编译器不需要指定数据类型,运行期间再指定数据类型。

Java中的泛型是一个通过<T>的方式实现的,那么Rust中的泛型如何实现呢?

泛型函数

/// Pick `even` or `odd` depending on the value of `n`.
//定义一个函数,该函数的请求参数和响应参数都指定T即泛型
fn pick<T>(n: i32, even: T, odd: T) -> T {
    if n % 2 == 0 {
        even
    } else {
        odd
    }
}

fn main() {
    //使用时再确定具体的类型,这里指定的泛型类型为i32
    println!("picked a number: {:?}", pick(97, 222, 333));
    //这里指定的泛型类型为元组
    println!("picked a tuple: {:?}", pick(28, ("dog", 1), ("cat", 2)));
}

以上代码演示的在函数中如何使用泛型。Rust中的泛型跟Java类似都是通过<>的方式实现。

泛型数据类型

前面说了如何在函数中定义泛型,接下来就是在结构体中定义泛型

#[derive(Debug)]
struct Point<T> { //定义结构体Point,并且设置泛型T
    x: T,
    y: T,
}

//定义结构体Point的实现方法,并且设定泛型T
impl<T> Point<T> {
    fn coords(&self) -> (&T, &T) {
        (&self.x, &self.y)
    }

    // fn set_x(&mut self, x: T)
}

fn main() {
    //初始化结构体并且指定泛型类型为i32
    let integer = Point { x: 5, y: 10 };
    //初始化结构体并且指定泛型类型为f64
    let float = Point { x: 1.0, y: 4.0 };
    println!("{integer:?} and {float:?}");
    println!("coords: {:?}", integer.coords());
}

以上就是Rust泛型的基础实现,很基础。

参考

google.github.io/comprehensi…