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

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

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

最新文章

  1. HQL查询——关联和连接
  2. rpm安装rpm-package报错:Header signature NOKEY 和 error: Failed dependencies:
  3. java面向对象编程--第九章 多态和抽象
  4. javascript笔记——jquery.each中使用continue和break的方式
  5. SAE 合并图片
  6. UILocalNotification
  7. Apache配置支持include
  8. Struts2 拦截器具体配置过程
  9. 最简单的Java框架
  10. Cache基础知识OR1200在ICache一个简短的引论
  11. 可参考的gulp资源
  12. 使用JsonConfig控制JSON lib序列化
  13. DOM&amp;JavaScript示例&amp;练习
  14. git工作流程一览
  15. Vue接口异常时处理
  16. python ----面向对象的三大特性---多态
  17. 项目中的java文件没有在WEB-INF\classes中生成class文件
  18. 小技巧:windows软件窗口键盘移动
  19. CountDownLatch两种用法
  20. SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法(2)

热门文章

  1. 机器学习-5 支持向量机SVM
  2. 获取Class的实例
  3. Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制
  4. javascript中中文转码的方法
  5. Programming In Lua 第九章
  6. .NET开发框架(四)-服务器IIS安装教程
  7. java html中文汉字 反转义
  8. 异常——cmd下javac错误:编码GBK不可映射字符
  9. jekyll搭建个人博客1
  10. Java编程思想:File类list()方法