Rust泛型、特征、生命周期

泛型

例如:fn largest(list:&[T])->T{....}
编译器在编译时将”占位符”替换为具体的类型。

fn largest(list:&[i32])->i32{}
//把i32换成T即可实现泛型。
let num=[2,34,56,8];
let result=largest(&num);

结构体泛型:

struct Point<T>{x:T,y:T}

枚举泛型:
enum Option{
Some(T),None,}
enum Result{
Ok(T),Err(E),}

泛型代码的性能:使用泛型代码和使用具体类型的代码运行速度是一样的。
单态化(monomorphization):在编译时将泛型替换为具体类型的过程。

Trait:抽象的定义共享行为,把方法放在一起,来定义实现某种目的所必需的一组行为。

方法:和函数类似,但是是impl定义,会有self参数,后面调用采用XXX.()的形式。

pub trait Summary{
    fn summarize(&self)->String;
}

impl Summary for NewsArticle{
    fn summarize(&self)->String{   
    }
}
生命周期可以帮助编译器执行一个简单的规则: 任何引用本身都不能比它引用的对象存活地更久。换句话说,生命周期帮助编译器消除悬空指针错误(注:也就是说在引用的情况下才会出现生命周期标注)。

1.这段代码编译错误,就是生命周期长度短了。

//error:`y` does not live long enough
{
let x: &Vec<i32>;   //并没有赋初始值,所以生命周期不是从这里开始。
    {
                 let y =Vec::new();//----+
//                               | y's lifetime
//                               |
        x = &y;//----------------|--------------+
//                               |              |
    }// <------------------------+              | x's lifetime
    println!("x's length is {}", x.len());//    |
}// <-------------------------------------------+

2.生命周期标注语法(描述了多个引用的生命周期间的关系,但不影响生命周期)

fn longer(s1: &str, s2: &str) -> &str {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}

longer 函数取 s1 和 s2 两个字符串切片中较长的一个返回其引用值。但只这段代码不会通过编译,原因是返回值引用可能会返回过期的引用
当然我们可以把 r 的使用移到 s1 和 s2 的生命周期范围以内防止这种错误的发生,但对于函数来说,它并不能知道自己以外的地方是什么情况,它为了保障自己传递出去的值是正常的,所有权原则消除一切危险,所以 longer 函数并不能通过编译。

&i32 // 常规引用
&'a i32 // 含有生命周期注释的引用
&'a mut i32 // 可变型含有生命周期注释的引用

fn longer<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s2.len() > s1.len() {
        s2
    } else {
        s1
    }
}

我们需要用泛型声明来规范生命周期的名称,随后函数返回值的生命周期将与两个参数的生命周期一致。

你可能感兴趣的:(Rust学习笔记,rust,开发语言,后端)