第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

【九月打卡】第5天 Rust 所有權(quán)的轉(zhuǎn)移

標(biāo)簽:
征文 活動(dòng)

课程章节: 第3章 Rust进阶

主讲老师叶枭

课程内容:

今天学习的内容是 Rust 中所有权的转移

还是以这段代码为例:

fn main() {
  let s1 = String::from("hello");
  let s2 = s1;
  println!("{}", s1);
} 

这段代码运行会报错,提示变量 s1 的值已经被移动了。

对于 JSer 来说,这有些不易理解。因为如果是按照 JS 中的语法来看,let s2 = s1 就是做了一个赋值操作,将变量 s1 的值赋值给了变量 s2,s1 是可以正常打印的。

而在 Rust 中,这里有两点是和 JS 不同的。一是字符串值属于复杂数据类型,存在堆内存中。二是由于所有权的存在,导致一个值只能有一个所有者。所以在将 s1 的值交给 s2 之后,值的所有者变为了 s2,s1 不再有对值的控制权,所以再打印 s1 就会报错。

这个过程涉及到了一个新的特性,所有权的转移。

所有权的转移

Rust 中的复杂数据类型的值,都存在堆内存中。比如:

let s1 = String::from("hello");
let s2 = s1;

第一行代码运行时,会申请一块堆内存空间来存放字符串值,然后将该堆内存的指针地址,赋值给变量 s1,存在栈内存中。

第二行代码,是将变量 s1 所绑定的一个指针地址,转移给了变量 s2,导致 s1 不再拥有对指针地址的所有权。

这个过程就叫所有权的转移。

上面的代码示例中是通过赋值操作,将值的所有权进行了转译。除此之外,函数传参,函数返回等操作也会发生所有权的转移,比如:

fn main() {
  let s1 = String::from("hello");
  // 将变量 s1 对字符串值的所有权转移给了函数 reverse。到这一步,s1 就失去了对值的所有权。
  // 函数 reverse 执行完成,s2 拥有了函数返回值的所有权
  let s2 = reverse(s1);
  println!("{}", s2);
}

// 参数 s 拿到了字符串值的所有权,在函数作用域内可以使用该值
fn reverse(s: String) -> String {
  // 函数通过返回值,又将 s 的所有权转移回去
  s.chars().rev().collect()
}

课程收获

这节课学习了所有权的转移,对于一个复杂数据类型的值,在执行赋值操作,函数传参,函数返回等操作时,会将所有权进行转移。

图片描述

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消