Rust学习笔记(七)所有权与函数
将值传递给函数在语义上和把值赋给变量是类似的。
把值传递给函数将发生移动或复制,例:fn main() { let s = String::from("hello"); take_ownership(s); let n = 666; makes_copy(n); println!("n: {}", n); println!("s: {}", s); } fn take_ownership(str: String) { println!("str: {}", str); } fn makes_copy(number: i32) { println!("number: {}", number); }
build以上代码,编译器将提示错误: error[E0382]: borrow of moved value: `s` --> srcmain.rs:8:23 | 2 | let s = String::from("hello"); | - move occurs because `s` has type `String`, which does not implement the `Copy` trait 3 | take_ownership(s); | - value moved here ... 8 | println!("s: {}", s); | ^ value borrowed here after move For more information about this error, try `rustc --explain E0382`. error: could not compile `rust_learning` due to previous error
根据提示可以看出: fn main() { let s = String::from("hello"); take_ownership(s);//s的值移动到了函数里,所以s失效,s在后面就不可再次使用。 let n = 666; makes_copy(n);//x本该也移动至函数,但i32是可Copy的,所以这里发生的是复制,因此x在后面还可使用。 println!("n: {}", n); println!("s: {}", s); } fn take_ownership(str: String) {//str进入作用域 println!("str: {}", str); }//离开作用域,Rust调用drop方法,str的堆内存被释放 fn makes_copy(number: i32) {//number(由n复制的副本)进入作用域 println!("number: {}", number); }//i32是完全存储在栈上的数据,所以离开作用域后被弹出栈即可,不需释放堆内存。 返回值与作用域
函数在返回值的过程中也会发生所有权的转移。例: fn main() { let s1 = give_ownership();//give_ownership将返回值所有权移动给s1 let s2 = String::from("hello");//s2进入作用域 let s3 = take_and_give_back(s2);//s2被移动到函数take_and_give_back里 //函数又将返回值移动给s3 println!("{} {} {}", s1, s2, s3)//由于s2已被移动至函数take_and_give_back里,所以此处s2无效 } fn give_ownership() -> String{ let str = String::from("hello"); str//返回str并将其所有权移出给调用它的函数 } fn take_and_give_back(str: String) -> String { str//返回str并将其所有权移出给调用它的函数 }
一个变量的所有权总是遵循同样的模式: 把一个值赋给其它变量时就会发生移动(可Copy的变量发生复制) 当一个包含堆内存上数据的变量离开作用域时,它会被drop方法释放,除非其所有权移动到另一个变量上了
如何让函数使用某个值,但不获得其所有权? 一种做法是将值传入函数, 函数用完后再将其移动回来。例: fn main() { let s1 = String::from("hello"); let (s2, len) = calculate_length(s1); println!("The length of {} is {}.", s2, len); } fn calculate_length(s: String) -> (String, usize) { let length = s.len(); (s, length) }
但这种实现看起来不够优雅,所以Rust有一个特性叫做"引用(Reference)" 对于引用的概念及用法将在下一节继续。
618抵制显卡接盘行动本次矿难已经两年了20192020年,这是游戏玩家的盛宴。那时候铭瑄580巨无霸全新常年799899,拼多多百亿补贴1660s两根8G海盗船的3200内存条才1949,2070s两
耐摔护眼资源多读书牛2AI学习平板大家好,我是波导终结者。家里的小朋友也五六岁了,平时学习却不怎么认真,玩变形金刚和乐高可以玩一整天,要他练几页字却像是要了老命。现在的学习,各种手机平板已经是不可能离得开的了,就算
智能锁都出3D人脸识别了?靠不靠谱?时至今日,智能锁已经是很普遍的入户安全产品了,不仅能解放钥匙,还承载了更多的入户体验和安全守护。很多人对智能锁的现在已经不是单单的密码锁指纹锁了。已经有更多的技术加入到了智能锁里面
2022备用机选择本人重度手机使用者,加上开宽带又增加了两个号码就想弄台备用机。要求能玩王者刷抖音,CPU最低骁龙660665670675710835845天玑800U,麒麟970810,等。电池比
玩转MIUI13,小部件里的3大实用功能分享MIUI13的小部件算是它的一大亮点,也有不少人为了这个功能专门去刷机更新MIUI13。我使用MIUI13的小部件也有一段时间了,不过日常使用频率最高无外乎3个类型的小部件时钟,天
IP属地公开水军裸泳藏不住了近日,包括微信微博抖音等的互联网平台纷纷上线了显示IP属地功能,用户在发言和分享时,会根据运营商提供的信息显示所在地,而且用户无法主动开启或关闭相关展示。该功能上线后,引发了网民的
马斯克与川普440亿美元只为让你发声?推特新晋老板马斯克刚刚表示将解禁前总统特朗特的平台账号。于是,无数网友纷纷脑补出一出大戏一个男人豪掷440亿美元,就为了另一个男人能在曾经最爱的社交媒体平台上自由发声。川普是个推特
58同城,裁员惹上麻烦了来源丨HR新逻辑原创首发作者丨HRLogic编辑中心嗨,这里是HR新逻辑HRL!近日,58同城员工侯某在网上发表长文,怒斥58同城的不公平裁员。据侯某所述,他就职于58同城旗下的安
盘点互联网花式裁员近期,各行各业裁员消息纷至沓来,其中尤以互联网企业引起极大关注,几乎所有一线大厂都有涉及。不光曝出的裁员比例高,而且连裁员的叫法也翻出了新花样。一般公司裁员都是辞退信,有些互联网企
26分钟充电5012GB256GB,高配置降价到1999元,价格变得更亲民市面上的手机品牌众多,数一数二的几家至少有一项突出的优势,像苹果就以其独有的iOS系统享誉全球,索尼以其强大的摄影功能收获大批的粉丝。因此,国内手机品牌为了获得更多的市场份额,在保
雷军真良心!小米机皇降4500,12GB512GB2K大屏最近小米的降价操作一波接一波,多少有点让人应接不暇。本以为前段时间小米11Ultra的降价已经是大操作了,没想到这段时间小米MIXFold的降价更加让人心动,直降4500!今天我们