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

    文章

    4556

    浏览量

    66805
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32397

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

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

收藏 人收藏

    评论

    相关推荐

    详解父组件向子组件传值与父子组件传值

    父子组件传值,父子组件传值,作用插槽
    发表于 02-22 08:17

    词法作用和闭包

    #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 06:46

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

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

    基于若干直觉模糊关系的近似推理方法

    通过定义一种直觉模糊加法算子,修正Ra的直觉化,研究直觉模糊三角模及其剩余蕴涵算子。将Mizumoto定义的系列模糊关系自然地扩展为直觉模糊关系,通过算例,从8个方面量化比较
    发表于 04-15 09:38 11次下载

    基于条件熵的直觉模糊条件推理

    该文在利用隶属度和犹豫度计算直觉模糊逻辑命题真值的对称合成方法的基础上,提出了一种基于条件熵的直觉模糊条件推理新算法。将直觉模糊条件推理规则的前件和后件与决策
    发表于 11-11 15:41 12次下载

    新版直觉式建模3D CAD软件

    新版直觉式建模3D CAD软件      PTC公司(参数技术公司)近日宣布,最新版直觉式建模3D CAD软件CoCreate 17.0即将上市。CoCreate是世界上首个直觉建模解决方案,其
    发表于 03-25 17:40 1999次阅读

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

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

    直觉multiplicative集

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

    一种直觉模糊熵的功利化定义的度量方法

    为解决直觉模糊熵的定义和度量不合理问题,提出了一种直觉模糊熵的公理化定义并构造了新的度量方法。首先分析了现有直觉模糊熵的公理化定义中存在的差异并指出其缺陷和不足;接着提出了一种改进的直觉
    发表于 12-27 16:13 0次下载

    基于直觉模糊熵和协相关度的决策方法

    针对决策信息为直觉模糊集且属性权重完全未知的多属性决策问题,提出了一种基于直觉模糊熵和协相关度的决策方法。对于直觉模糊集的直觉性和模糊性,从公理化定义出发,给出了一种改进的
    发表于 12-27 16:46 0次下载

    引入直觉由于模糊集建立的三支决策模型

    决策者本身的能カ限制以及被评价对象存在的不确定性,导致三支决策模型在处理信息模糊以及由主观认知概念模糊而产生犹豫的决策问题时表现力不足。为解决上述问题,文中引入直觉犹豫模糊集建立相应的三支决策模型
    发表于 05-13 13:51 9次下载