NLL导致的非直觉的作用域扩大

电子说

1.3w人已加入

描述

NLL 导致的非直觉的作用域扩大

1. NLL 完全无视词法作用域

1.1. 是否可以认为 NLL 在fb.set(&b);处缩短了fb的起始生存期以配合b?
1.2. 应该认为 NLL 缩短了fb 还是延长了b 的生存期?


	

struct MyCell(T); impl MyCell { pub fn set(&mut self, t: T) { self.0 = t; } } let a = 3; let mut fb = MyCell(&a); // 将 fb 绑定到 a 的生存期 let _ = { let b = 4; fb.set(&b); false // 直觉上 b 在此结束生存期 }; // 直觉上 fb 在此结束生存期 // NLL 智能的使 b 和 fb 的生存期同时结束, 使得 fb 可以使用 b

2. 强制延长外部变量生存期得到符合直觉的编译失败


	

struct MyCell(T); impl MyCell { pub fn set(&mut self, t: T) { self.0 = t; } } let a = 3; let mut fb = MyCell(&a); // 将 fb 绑定到 a 的生存期 let _ = { let b = 4; fb.set(&b); false // b 在此结束生存期 }; fb; // 强制延长 fb 生存期

3. Drop导致隐式生存期延长而编译失败

主代码与 1 完全相同, 与 1 相比仅多一个空Drop, 而编译失败原因同 2


	

struct MyCell(T); impl MyCell { pub fn set(&mut self, t: T) { self.0 = t; } } impl Drop for MyCell { fn drop(&mut self) {} } let a = 3; let mut fb = MyCell(&a); // 将 fb 绑定到 a 的生存期 let _ = { let b = 4; fb.set(&b); false // b 在此结束生存期 }; // drop 导致的隐式延长 fb 生存期

4. 编译失败 循环使得fb生存期不能缩短

有可能rust升级使其可通过编译


	

struct MyCell(T); impl MyCell { pub fn set(&mut self, t: T) { self.0 = t; } } let a = 3; let mut fb = MyCell(&a); // 将 fb 绑定到 a 的生存期 let _ = loop { // loop 使得 fb 必须在此有效 而不能使 b 满足此要求 let b = 4; fb.set(&b); if true { break false } // b 在此结束生存期 }; // fb 在此结束生存期

5. 编译成功 基本等同于 4

NLL 过于智能的消除了 loop


	

struct MyCell(T); impl MyCell { pub fn set(&mut self, t: T) { self.0 = t; } } let a = 3; let mut fb = MyCell(&a); // 将 fb 绑定到 a 的生存期 let _ = loop { let b = 4; fb.set(&b); break false; // 过于智能的消除了 loop };


                                                                                                    

  审核编辑:汤梓红


打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分