0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

jf_wN0SrCdH ? 来源:Rust语言中文社区 ? 作者:Rust语言中文社区 ? 2022-11-24 11:29 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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 };


审核编辑:汤梓红


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

    关注

    30

    文章

    4906

    浏览量

    71033
  • 编译
    +关注

    关注

    0

    文章

    680

    浏览量

    34242

原文标题:NLL 导致的非直觉的作用域扩大

文章出处:【微信号:Rust语言中文社区,微信公众号:Rust语言中文社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    词法作用和闭包

    #hello,JS:14闭包(词法作用
    发表于 05-20 15:35

    作用作用链知识

    #hello,JS:04作用作用
    发表于 09-10 10:21

    介绍一些与变量相关的存储属性与作用

    目录前言一、存储类&作用&生命周期&链接属性的概念解析二、linux下C程序 的内存映像三、存储类相关的关键字四、作用详解五、变量的生命周期七、链接属性前言本篇文章将会
    发表于 02-14 07:00

    python变量的作用

    python变量的作用1. 作用Python的作用可以分为四种:L (Local) 局部
    发表于 03-03 16:50

    MCU中局部变量的作用是什么?

    MCU中局部变量的作用是什么
    发表于 10-09 08:51

    c语言变量的作用和存储类别

    c语言变量的作用和存储类别简述,很不错哦。
    发表于 07-14 17:12 ?0次下载

    关于Java变量的作用分析

    目录 1.静态作用与动态作用 2.变量的作用 3.Java 中变量的
    发表于 09-25 16:28 ?0次下载

    Java中bean的作用

    java开发者都会在实体对象的属性中加上private关键字,而在业务类对外发放的方法中写上public关键字,这并不是习惯,而是开发者深谙其道,这就是java对象中filed的作用。 举个
    发表于 09-25 16:36 ?0次下载
    Java中bean的<b class='flag-5'>作用</b><b class='flag-5'>域</b>

    基于修正的直觉模糊集成算子

    已有的一些直觉模糊集成算子在处理一些特殊直觉模糊数时会出现反直觉现象。首先介绍了两个直觉模糊集成算子和直觉模糊数的比较方法。接着,举例说明了
    发表于 11-17 14:36 ?9次下载

    直觉multiplicative集

    针对软直觉模糊集在决策中出现的部分反直觉的现象,结合直觉multiplicative集,首先提出了一种新的软集模型软直觉multiplicative集,推广了软集和
    发表于 11-25 10:35 ?0次下载

    C++封装:类的作用和实例化

    C++封装:类的作用和实例化
    的头像 发表于 06-29 14:28 ?3829次阅读
    C++封装:类的<b class='flag-5'>作用</b><b class='flag-5'>域</b>和实例化

    程度粗糙直觉模糊集模型研究分析综述

    针对经典粗糙直觉模糊集理论仅考虑了集合中的最小最大隶属度与隶属度,而忽略了介于二者之间的隶属度与隶属度的问题,从程度粗糙集的角度对其进行了分析研究。首先,将程度粗糙集引入到经典粗糙直觉
    发表于 06-09 15:54 ?15次下载

    python变量的作用

    python变量的作用 1. 作用 Python的作用可以分为四种: L (Local)
    的头像 发表于 03-03 16:50 ?1864次阅读

    解读Spring 的内置作用及开发应用

    本文详细解析了 Spring 的内置作用,包括 Singleton、Prototype、Request、Session、Application 和 WebSocket 作用,并通过
    发表于 07-01 11:51 ?475次阅读
    解读Spring 的内置<b class='flag-5'>作用</b><b class='flag-5'>域</b>及开发应用

    CAN数据帧的各个及其作用

    CAN数据帧由多个组成,包括帧起始、仲裁、控制、数据和帧结束。每个都有其特定的作用
    的头像 发表于 07-24 15:10 ?2922次阅读