Rust泛型、特征、生命周期

本文深入探讨Rust编程语言中的泛型,包括函数和结构体泛型,以及枚举泛型。阐述了泛型代码的性能特点——单态化,确保运行效率。同时,讲解了生命周期的概念及其在防止悬空指针错误中的作用,通过例子说明生命周期标注的必要性。此外,还介绍了Trait作为抽象行为的定义,并展示了如何实现和使用Trait。最后,讨论了生命周期标注语法,确保引用的有效性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

泛型

例如:fn largest<T>(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<T,E>{
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编程的读者而言,选择合适的书籍至关重要。下面是一些建议: #### 《Programming Rust》 这本书不仅涵盖了Rust的基础概念,还特别强调了如何利用Rust的强大类系统来编写高效且无错误的代码[^3]。书中有关章节专门讨论了的应用场景及其优势,适合那些想要深入了解这一特性的开发者。 #### 《The Rust Programming Language》(俗称 "Rust Book") 官方文档本身就是学习任何新语言的最佳起点之一。此书由Mozilla维护更新,包含了大量关于的实际案例研究以及最佳实践指导[^1]。特别是第9章“通用编程”,详细介绍了如何定义带有参数化类的函数与数据结构,并解释了生命周期、特质边界等高级主题。 #### 《Hands-On Systems Programming with Rust》 该著作聚焦于系统层面应用开发过程中遇到的具体挑战,其中涉及到了许多运用解决实际问题的例子。作者展示了怎样借助Rust的安全保障机制(如所有权模),配合灵活多变的设计模式,实现既稳定又高效的解决方案[^2]。 除了上述提到的作品外,《Rust Essentials》,《Mastering Rust》也都是不错的选择,它们各自从不同角度切入,帮助读者全面把握Rust中的特性。 ```rust // 定义一个接受任意类作为参数的函数示例 fn largest<T: PartialOrd + Copy>(list: &[T]) -> T { let mut largest = list[0]; for &item in list.iter() { if item > largest { largest = item; } } largest } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值