The Rust Programming Language - 第10章 泛型、trait和生命周期 - 10.3 生命周期与引用有效性

10 泛型、trait和生命周期

每一种编程语言都有高效处理重复概念的工具,Rust使用的是泛型。泛型是具体类型或其它抽象类型的替代。我们可以表达泛型的属性,比如他们的行为如何与其它类型的泛型相关联,而不许需要在编写或者编译代码时知道它们在这里实际上代表的是什么

我们编写一个函数,想让它对多种类型的参数都具有处理能力,而不仅仅是针对某种具体类型的参数定义函数。这个时候我们就可以指定函数的参数类型是泛型,而不是某种具体类型。我们之前使用了Option、Vec!和HashMap

提取函数来减少重复

在此之前,我们先来回顾一个不使用泛型就解决代码重复的技术,提取函数

fn main() {
    let number_list = vec![34,25,50,100,65];
    let mut largest = number_list[0];

    for number in number_list {
        if number > largest  {
            largest = number
        };
    };
    println!("the largest number is {}",largest)
}

我们先遍历了一个vector,求其元素的最大值,那如果我们要遍历另一个元素的话,就需要再重复一下这些代码,现在我们用函数来做个提取

fn largest(list:&[i32])->i32{
    let mut largest = list[0];

    for &item in list {
        if item > largest {
            largest = item
        };
    };
    largest
}
fn main(){
    let number_list = vec![34,50,25,100,65];

    let result = largest(&number_list);
    println!("{}",result)
}

通过函数抽象,我们就不用再重用代码了,只需要调用这个比较逻辑(我们新定义好的函数)即可

但是!我们在这里寻找的是vec中的最大值,如果我们要寻找char、slice中的最大值呢?下面我们来着手解决这个问题

10.3 生命周期与引用有效性

Rust中的每一个引用都有其声明周期,也就是引用保持有效的作用域。它如大部分变量的类型一样是可以推断的,但有时候引用的生命周期关联方式不同,我们需要使用泛型声明周期参数来注明他们的关系,这样就能保证实际引用是有效的

生命周期避免了悬垂引用

fn main(){
    let r;
    {
        let x = 5;
        r = &x;
    }
    println!("r:{}",r);
}
出现错误
error[E0597]: `x` does not live long enough
 --> src\main.rs:7:13
  |
7 |         r = &x;
  |             ^^ borrowed value does not live long enough
8 |     }
  |     - `x` dropped here while still borrowed
9 |     print

你可能感兴趣的:(#,Rust,rust,开发语言,后端,生命周期,引用)