rust学习_所有权

所有权是什么  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 函数的结束,其局部变量的值本身没有被当作返回值,被释放了。但它的
引用却被返回,这个引用所指向的值已经不能确定的存在,故不允许其出现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

simper_zxb

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值