所有权是什么 | 1为内存安全和并发提供了强大的保障 2.同时避免了垃圾回收带来的性能开销 |
所有权的规则 | 1.rust中的每个值都有一个变量,称其为所有者 2.一次只能有一个所有者 3.所有者不在程序运行范围时,该值直接被删除 |
变量范围 | 变量范围是变量的一个属性,其代表变量的可行域 |
内存和分配 | 栈:已知且固定大小的数据,分配到栈上 堆: 大小未知或者可能变化的数据,比如string类型,rust分配到堆上 |
变量与数据交互的方式 | 1.移动:想象下传球,你把球传给另一个人 你就没有这个球的了 let a = String::from(); //a给了b a无效了 let b = a; 2.克隆:你得到和别人一摸一样的球 let c = Photo::new("我的") let d = phtot.clone() 3.拷贝:有些东西很轻 你可以轻松复制很多份 let e = 123456 let f = e // e 和 f都有效 4.不可变引用 let g = String::from("a") let h = &g h可以查看g 但不能修改 5.可变引用 let i = String::from("a") let j = &mut i; j和i都可以查看和修改 |
函数返回值的所有权机制 | 1.函数返回值的所有权机制 1.当一个函数返回一个东西时,如果这个东西是小的(比如数字,布尔),那么函数就像在复印一张纸,给你一张复印件,它还留着原来那张纸 2.但是如果这个东西比较大(比如一段文件,一个列表),那么函数就直接把东西给了你了,自己不留着,你获取了这个东西的所有权 2.举例 fn give_away_list() -> Vec<i32> { let my_list = vec![1,2,3] my_list //返回my list // println!("Inside function: {:?}", my_list); // 错误:使用已移动的值 } fn main(){ let my_list = give_away_list(); //上面函数中的my_list所有权已经转移到了这里的my_list 所以上面函数打印my list时会报错 println!("Revicewd list:{:?}",my_list) } 在give_away_list函数内部再次访问 my_list时会报错,因为my_list的所有权已经给了my_list |
引用与租借 | 引用 引用的概念 像一个标签或指针,指向某个数据在内存中的位置,但并不拥有那个数据 引用的方式 通过&符号创建 let a = &value 租借 租借的概念 就像在图书馆看书,你可以租借书阅读,但是这本书不属于你,你看完后还得还书 租借的两种方式 1.不可变租借:以只读模式修改借过来的书,不能在书上做任何标记或修改 1.通过 & 进行不可变租借。如: let a = &b 2.可变租借:可以在借过来的书上做标记什么的,但是书最后还要还给图书馆 1.通过 &mut 进行可变租借。 例: let a = &mut b |
垂悬引用 | 垂悬引用:你有个朋友的地址,你打算去找他,但是你的朋友已经搬家了。你手里的地址(指针)还在, 但它指向的房子(数据)已经不再是你的朋友的家了。这时候,你手里的地址就是一个垂悬引用。 举例: fn main() { let reference_to_nothing = dangle(); } fn dangle() -> &String { let s = String::from("hello"); &s } 很显然,伴随着 dangle 函数的结束,其局部变量的值本身没有被当作返回值,被释放了。但它的引用却被返回,这个引用所指向的值已经不能确定的存在,故不允许其出现。 |
rust学习_所有权
于 2024-09-22 08:42:16 首次发布