• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Rust生命周期bound用于泛型的引用

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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

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

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[续] MATLAB 混合编程——下篇:调用其它编程语言发布时间:2022-07-18
下一篇:
3.5 Rust Generic Types, Traits, and Lifetimes发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap