当前位置:首页 > 科技  > 软件

大白话讲解Rust中令人头痛的“所有权”

来源: 责编: 时间:2024-04-24 17:32:26 278观看
导读今天我们来聊聊Rust中一个又酷又令人头痛的概念——所有权。这玩意儿可不简单,它能让你的代码既安全又高效。别急,咱们慢慢来,用一些大白话和代码例子,让你轻松搞懂所有权。所有权是个啥?所有权系统是Rust的核心,它帮我们搞

今天我们来聊聊Rust中一个又酷又令人头痛的概念——所有权。这玩意儿可不简单,它能让你的代码既安全又高效。别急,咱们慢慢来,用一些大白话和代码例子,让你轻松搞懂所有权。Ohh28资讯网——每日最新资讯28at.com

所有权是个啥?

所有权系统是Rust的核心,它帮我们搞定内存管理。简单来说,在Rust里,每个值都绑定到一个变量上,这个变量就是它的“老板”。当“老板”不在其作用域内时,Rust会自动清理它所管理的值,这个过程叫做丢弃。Ohh28资讯网——每日最新资讯28at.com

栈和堆:内存的两个战场

在我们深入了解所有权之前,得先了解一下内存的两个主要战场:栈和堆。Ohh28资讯网——每日最新资讯28at.com

  • 栈:想象一下,你有一叠盘子,你总是从上面拿盘子,也总是把盘子放回最上面。栈就是这样,数据大小固定,存取速度飞快。
  • 堆:这地方就像个杂乱的仓库,你想放多大的东西都行,但找起来就慢多了。操作系统得帮你找个足够大的地方,还得做记录,所以速度慢一些。

所有权的三条黄金法则

Rust的所有权遵循三条简单但强大的规则:Ohh28资讯网——每日最新资讯28at.com

  1. 每个值都有一个“老板”。
  2. 一个值在任何时候只能有一个“老板”。
  3. 当“老板”离开作用域时,该值就会被丢弃。

代码示例:所有权的转移

现在,让我们通过一些代码来感受一下所有权是如何工作的。Ohh28资讯网——每日最新资讯28at.com

fn main() {   let s1 = String::from("hello"); // s1成了"hello"的老板   let s2 = s1; // 所有权从s1转到了s2,s1不再是老板了   // println!("{}", s1); // 这里s1不能用了,因为它已经不是老板了}

在上面的例子中,s1 原本拥有 "hello" 的所有权。但当我们用 let s2 = s1; 把所有权转给了 s2,s1 就失效了,再想用它就会出错。Ohh28资讯网——每日最新资讯28at.com

克隆与拷贝:深拷贝和浅拷贝的故事

  • 克隆(深拷贝):用 clone 方法可以复制一个值,包括它在堆上的数据。这招适用于像 String 这样的复杂类型。
fn main() {   let s1 = String::from("hello");   let s2 = s1.clone(); // 这里我们复制了s1   println!("s1 = {}, s2 = {}", s1, s2); // 看,s1和s2都是有效的}
  • 拷贝(浅拷贝):对于基本类型,如整数,赋值操作会自动拷贝值,因为它们存储在栈上。
fn main() {   let x = 5;   let y = x; // x的值被拷贝给了y,x和y都是有效的   println!("x = {}, y = {}", x, y);}

函数中的所有权:传值和返回

当你把一个值传给函数时,所有权也会跟着走。同样,函数返回一个值时,所有权就转移到了调用者。Ohh28资讯网——每日最新资讯28at.com

fn takes_ownership(some_string: String) {   println!("{}", some_string);} // some_string的所有权被移走了,内存被释放fn main() {   let s = String::from("hello");   takes_ownership(s); // s的值被传给了函数   // println!("{}", s); // 这里不能再用s了,因为它已经被传走了}

总结

Rust的所有权系统可能一开始有点难懂,但它确保了内存使用的安全性,并且避免了手动内存管理带来的风险。通过上面的代码示例,我们可以看到Rust如何在编译时检查内存安全规则。Ohh28资讯网——每日最新资讯28at.com

所有权是Rust语言的一块基石,它让内存管理变得可靠和自动化。掌握了所有权,你就能在Rust的世界里自由飞翔了!Ohh28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-85224-0.html大白话讲解Rust中令人头痛的“所有权”

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 小红书面试:v-for循环,为什么不建议使用index作为key?

下一篇: 聊聊如何优雅地Spring事务编程

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 8月见!小米MIX Fold 3获得3C认证:支持67W快充

    这段时间以来,包括三星、一加、荣耀等等有不少品牌旗下的最新折叠屏旗舰都得到了不少爆料,而小米新一代折叠屏旗舰——小米MIX Fold 3此前也屡屡被传
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
Top