0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

NLL導(dǎo)致的非直覺的作用域擴(kuò)大

jf_wN0SrCdH ? 來(lái)源:Rust語(yǔ)言中文社區(qū) ? 作者:Rust語(yǔ)言中文社區(qū) ? 2022-11-24 11:29 ? 次閱讀

NLL 導(dǎo)致的非直覺的作用域擴(kuò)大

1. NLL 完全無(wú)視詞法作用域

1.1. 是否可以認(rèn)為 NLL 在fb.set(&b);處縮短了fb的起始生存期以配合b?
1.2. 應(yīng)該認(rèn)為 NLL 縮短了fb還是延長(zhǎng)了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 在此結(jié)束生存期 }; // 直覺上 fb 在此結(jié)束生存期 // NLL 智能的使 b 和 fb 的生存期同時(shí)結(jié)束, 使得 fb 可以使用 b

2. 強(qiáng)制延長(zhǎng)外部變量生存期得到符合直覺的編譯失敗


	

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 在此結(jié)束生存期 }; fb; // 強(qiáng)制延長(zhǎng) fb 生存期

3.Drop導(dǎo)致隱式生存期延長(zhǎng)而編譯失敗

主代碼與 1 完全相同, 與 1 相比僅多一個(gè)空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 在此結(jié)束生存期 }; // drop 導(dǎo)致的隱式延長(zhǎng) fb 生存期

4. 編譯失敗 循環(huán)使得fb生存期不能縮短

有可能rust升級(jí)使其可通過(guò)編譯


	

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 在此結(jié)束生存期 }; // fb 在此結(jié)束生存期

5. 編譯成功 基本等同于 4

NLL 過(guò)于智能的消除了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; // 過(guò)于智能的消除了 loop };


審核編輯:湯梓紅


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4670

    瀏覽量

    67760
  • 編譯
    +關(guān)注

    關(guān)注

    0

    文章

    646

    瀏覽量

    32664

原文標(biāo)題:NLL 導(dǎo)致的非直覺的作用域擴(kuò)大

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    詞法作用和閉包

    #hello,JS:14閉包(詞法作用
    發(fā)表于 05-20 15:35

    作用作用鏈知識(shí)

    #hello,JS:04作用作用
    發(fā)表于 09-10 10:21

    介紹一些與變量相關(guān)的存儲(chǔ)屬性與作用

    目錄前言一、存儲(chǔ)類&作用&生命周期&鏈接屬性的概念解析二、linux下C程序 的內(nèi)存映像三、存儲(chǔ)類相關(guān)的關(guān)鍵字四、作用詳解五、變量的生命周期七、鏈接屬性前言本篇文章將會(huì)
    發(fā)表于 02-14 07:00

    python變量的作用

    python變量的作用1. 作用Python的作用可以分為四種:L (Local) 局部
    發(fā)表于 03-03 16:50

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

    MCU中局部變量的作用是什么
    發(fā)表于 10-09 08:51

    c語(yǔ)言變量的作用和存儲(chǔ)類別

    c語(yǔ)言變量的作用和存儲(chǔ)類別簡(jiǎn)述,很不錯(cuò)哦。
    發(fā)表于 07-14 17:12 ?0次下載

    關(guān)于Java變量的作用分析

    目錄 1.靜態(tài)作用與動(dòng)態(tài)作用 2.變量的作用 3.Java 中變量的
    發(fā)表于 09-25 16:28 ?0次下載

    Java中bean的作用

    java開發(fā)者都會(huì)在實(shí)體對(duì)象的屬性中加上private關(guān)鍵字,而在業(yè)務(wù)類對(duì)外發(fā)放的方法中寫上public關(guān)鍵字,這并不是習(xí)慣,而是開發(fā)者深諳其道,這就是java對(duì)象中filed的作用。 舉個(gè)
    發(fā)表于 09-25 16:36 ?0次下載
    Java中bean的<b class='flag-5'>作用</b><b class='flag-5'>域</b>

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

    已有的一些直覺模糊集成算子在處理一些特殊直覺模糊數(shù)時(shí)會(huì)出現(xiàn)反直覺現(xiàn)象。首先介紹了兩個(gè)直覺模糊集成算子和直覺模糊數(shù)的比較方法。接著,舉例說(shuō)明了
    發(fā)表于 11-17 14:36 ?9次下載

    直覺multiplicative集

    針對(duì)軟直覺模糊集在決策中出現(xiàn)的部分反直覺的現(xiàn)象,結(jié)合直覺multiplicative集,首先提出了一種新的軟集模型軟直覺multiplicative集,推廣了軟集和
    發(fā)表于 11-25 10:35 ?0次下載

    C++封裝:類的作用和實(shí)例化

    C++封裝:類的作用和實(shí)例化
    的頭像 發(fā)表于 06-29 14:28 ?3479次閱讀
    C++封裝:類的<b class='flag-5'>作用</b><b class='flag-5'>域</b>和實(shí)例化

    程度粗糙直覺模糊集模型研究分析綜述

    針對(duì)經(jīng)典粗糙直覺模糊集理論僅考慮了集合中的最小最大隸屬度與隸屬度,而忽略了介于二者之間的隸屬度與隸屬度的問(wèn)題,從程度粗糙集的角度對(duì)其進(jìn)行了分析研究。首先,將程度粗糙集引入到經(jīng)典粗糙直覺
    發(fā)表于 06-09 15:54 ?15次下載

    python變量的作用

    python變量的作用 1. 作用 Python的作用可以分為四種: L (Local)
    的頭像 發(fā)表于 03-03 16:50 ?1395次閱讀

    解讀Spring 的內(nèi)置作用及開發(fā)應(yīng)用

    本文詳細(xì)解析了 Spring 的內(nèi)置作用,包括 Singleton、Prototype、Request、Session、Application 和 WebSocket 作用,并通過(guò)
    發(fā)表于 07-01 11:51 ?250次閱讀
    解讀Spring 的內(nèi)置<b class='flag-5'>作用</b><b class='flag-5'>域</b>及開發(fā)應(yīng)用

    CAN數(shù)據(jù)幀的各個(gè)及其作用

    CAN數(shù)據(jù)幀由多個(gè)組成,包括幀起始、仲裁、控制、數(shù)據(jù)和幀結(jié)束。每個(gè)都有其特定的作用,
    的頭像 發(fā)表于 07-24 15:10 ?426次閱讀