今天,尝试浅浅地分享一些我对 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 。
1
共 1 条评论, 1 页
评论区
写评论膜拜,大牛!