在实际编程中,可能会出现泛型引用这种情况,我们会编写如下的代码:

struct Inner<'a, T> {
data: &'a T,
}

会产生编译错误:

error[E0309]: the parameter type `T` may not live long enough
--> src/main.rs:16:5
|
15 | struct Inner<'a, T> {
| - help: consider adding an explicit lifetime bound `T: 'a`...
16 | data: &'a T,
| ^^^^^^^^^^^
|
note: ...so that the reference type `&'a T` does not outlive the data it points at
--> src/main.rs:16:5
|
16 | data: &'a T,
| ^^^^^^^^^^^

为什么会编译错误呢?因为T可以是任意类型,T自身也可能是一个引用,或者是一个存放了一个或多个引用的类型,而他们各自可能有着不同的生命周期。Rust编译器不能确认T会与'a存活的一样久。

所以编译器才提示我们:T的生命周期可能不够长,建议我们对泛型T进行生命周期bound,限定T的生命周期与'a一样长。

之后我们根据编译器的提示更改代码:

trait Print {
fn output(&self);
} struct Object<'a>{
data: &'a i32,
} impl<'a> Print for Object<'a> {
fn output(&self) {
println!("Object data: {}", self.data);
}
} struct Inner<'b, T: 'b + Print> {
pub a: &'b T,
} fn main() {
let data = 10;
{
let a = Object{data: &data};
let inner = Inner{a: &a};
inner.a.output();
}
}

对于生命周期bound,可以结合trait bound来理解。Rust的泛型有个特点就是trait boundtrait bound可以对泛型进行某些限制(只有实现了指定trait的类型才符合要求)。同样,我们也可以像泛型那样为生命周期参数增加限制,这被称为“生命周期bound”(lifetime bounds)。生命周期bound帮助Rust编译器验证泛型的引用不会存在的比其引用的数据更久。

上面的代码中,struct Inner<'b, T: 'b + Print>这行代码就是表示对泛型T同时进行trait bound和生命周期bound。

Rust通过生命周期参数注解引用来帮助编译器理解不同引用的生命周期如何相互联系。从而使编译器能够判断引用是否有效。

关注微信公众号,定期推送新文章!

Rust生命周期bound用于泛型的引用的更多相关文章

  1. rust 生命周期2

    之前定义的结构体,都是不含引用的. 如果想定义含引用的结构体,请定义生命周期注解 #[warn(unused_variables)] struct ImportantExcerpt<'a> ...

  2. 【译】深入理解Rust中的生命周期

    原文标题:Understanding Rust Lifetimes 原文链接:https://medium.com/nearprotocol/understanding-rust-lifetimes- ...

  3. rust 函数-生命周期

    记录一下自己理解的生命周期. 每个变量都有自己的生命周期. 在c++里生命周期好比作用域, 小的作用域的可以使用大作用域的变量. 如果把这里的每个作用域取个名,那么就相当于rust里的生命周期注解. ...

  4. 对Rust所有权、借用及生命周期的理解

    Rust的内存管理中涉及所有权.借用与生命周期这三个概念,下面是个人的一点粗浅理解. 一.从内存安全的角度理解Rust中的所有权.借用.生命周期 要理解这三个概念,你首要想的是这么做的出发点是什么-- ...

  5. [IoC容器Unity]第二回:Lifetime Managers生命周期

    1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...

  6. [转载][IoC容器Unity]第二回:Lifetime Managers生命周期

    1.引言 Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理,非常方便,下面就介 ...

  7. Unity(二)生命周期LifetimeManager

    描述:Unity的生命周期是注册的类型对象的生命周期,而Unity默认情况下会自动帮我们维护好这些对象的生命周期,我们也可以显示配置对象的生命周期,Unity将按照配置自动管理. //创建一个Unit ...

  8. Asp.Net Core中服务的生命周期选项区别和用法

    在做一个小的Demo中,在一个界面上两次调用视图组件,并且在视图组件中都调用了数据库查询,结果发现,一直报错,将两个视图组件的调用分离,单独进行,却又是正常的,寻找一番,发现是配置依赖注入服务时,对于 ...

  9. Maven 构建生命周期

    构建生命周期是什么? 构建生命周期阶段的目标是执行顺序是一个良好定义的序列.这里使用一个例子,一个典型的 Maven 构建生命周期是由下列顺序的阶段: 阶段 处理 描述 准备资源 资源复制 资源复制可 ...

随机推荐

  1. C# 死锁 TaskCompletionSource

    在异步转同步时,使用不当容易造成死锁(程序卡死) 看如下案例: 有一个异步方法 private static async Task TestAsync() { Debug.WriteLine(&quo ...

  2. black box黑盒测试

    软件规格说明书 等价类划分,完备性,无冗余性(不能有交集).   健壮等价类:无效等价类 边界值分析,对于一个含有n个变量的程序,采用边界值分析法测试程序会产生4n+1个测试用例           ...

  3. 深入理解Java虚拟机笔记——虚拟机类加载机制

    目录 概述 动态加载和动态连接 类加载的时机 类的生命周期 被动引用 例子一(调用子类继承父类的字段) 例子二(数组) 例子三(静态常量) 类加载的过程 加载 验证 准备 解析 符号引用 直接引用 初 ...

  4. iOS自动化探索(十)代码覆盖率统计

    iOS APP代码覆盖率统计 今年Q3季度领导给加了个任务要做前后端代码覆盖率统计, 鉴于对iOS代码代码比较熟就选择先从iOS端入手,折腾一整天后终于初步把流程跑通了记录如下 覆盖率监测的原理 Xc ...

  5. Oracle数据库备份---导出与导入

    利用windows的cmd命令备份导出数据(也可以连接上sqlplus进行操作)--导出--将数据库orcl完全导出 exp system/oracle@orcl file=c:\oracle_bak ...

  6. C++学习书籍推荐《Exceptional C++》下载

    百度云及其他网盘下载地址:点我 编辑推荐 <Exceptional C++:47个C++工程难题.编程问题和解决方案(中文版)>中的每个问题都给出了难度系数,在这些问题中阐释一些微妙的编程 ...

  7. Mysql CPU使用率长期100%的解决思路备忘

    最近一台服务器的CPU使用率长期保持在100%的状态,查看进程发现是Mysql服务导致的.于是搜索各方资料,终于成功解决问题.备忘以及分享一下,希望可以帮助各位新手朋友. (服务器运行环境是Windo ...

  8. Spark 的 python 编程环境

    Spark 可以独立安装使用,也可以和 Hadoop 一起安装使用.在安装 Spark 之前,首先确保你的电脑上已经安装了 Java 8 或者更高的版本. Spark 安装 访问Spark 下载页面, ...

  9. Java文本类型输入与输出

    import java.io.*; import java.time.LocalDate; import java.util.Scanner; public class Test { public s ...

  10. 【UVA - 10006 】Carmichael Numbers (快速幂+素数筛法)

    -->Carmichael Numbers  Descriptions: 题目很长,基本没用,大致题意如下 给定一个数n,n是合数且对于任意的1 < a < n都有a的n次方模n等于 ...