< 返回我的博客

爱国的张浩予 发表于 2021-02-25 09:45

Tags:lifetime,references,variables

今天,尝试浅浅地分享一些我对 rust 技术栈公认“深坑”【生命周期】的理解。坑太深,这次仅只·抛砖引玉·。

引言

就【生命周期】而言,rustc 的角色是【仲裁者】,而不是【执行者】。【生命周期标注】是被用来向【仲裁者】表述你的代码设计意图(这些意图可能直接通过扫描代码不容易被揣测出来),然后再由【仲裁者】判断你的代码意图是否可行(因为得安全)。你不能命令 rustc 要求某某变量一定得活多长时间。这是基本认识。

首先,

  • ·栈变量·讲【所有权】
  • ·指针·才讲【生命周期】
    • 下文中的·指针·皆都泛指·智能指针·与·引用·。

其次,

  • ·【静态分派】引用·讲【生命周期参数】。例如,&'a str。
  • ·【动态分派】指针(即,胖指针)·讲【生命周期限定条件】。例如,
    • Box<dyn Trait + 'static>
    • Ref<'a, dyn Trait + 'a>
    • &'a (dyn Trait + 'a)

再次,

  • 【生命周期参数】在【声明语句】(无论是【函数】声明,还是 Nominal Type 声明)中,
    • 在【类型参数】列表 <T, R, ...> 里被定义
    • 并被作为·类型·信息的一部分被保存
  • 【生命周期限定条件】是在【类型参数】被传递给【泛型类型】时,以“+”【限定条件】的语法形式,被定义。例如,Ref<'a, dyn Trait + 'a>。【生命周期限定条件】是被作为 Trait Object 实例信息被保存,而不是类型定义的一部分。

接着,

  • 【生命周期参数】是参照另一个【静态分派】引用或【栈变量】来向 rustc 描述当前【静态分派】引用的【生命周期】。
    • 场景一:参照【引用】描述【引用】。即,根据函数【引用】类型【形参】的生命周期推断函数【引用】类型【返回值】的生命周期。
    • 场景二:参照【栈变量】描述【引用】。即,根据 struct 实例推断其【引用】类型字段值的生命周期。即,参考 struct 实例栈变量何时被 drop 来反向推算它【引用】类型字段值活多长时间。
  • 【生命周期限定条件】是参照一个【静态分派】引用来描述【动态分派】指针(即,胖指针)的【生命周期】。

然后,对于缺省【生命周期】标注的【推断策略】,

  • 【生命周期参数】是【生命周期参数·省略·规则】。这个可以独立开讲了。以后,单独分享吧。
  • 【生命周期限定条件】是【默认对象生命周期限定条件】。这个也可以独立开讲了。以后,单独分享吧。

最后,一个特例 const / static 值的缺省生命周期都是 'static 。

评论区

写评论
kidd808 2021-02-25 12:46

膜拜,大牛!

1 共 1 条评论, 1 页