Rust 圣经 阅读 引用与借用

Rust 通过 借用(Borrowing) 在使用某个变量的指针或引用。
获取变量的引用,称之为 借用(borrowing)

引用与解引用

引用是为了解决在使用函数时,频繁地传递所有权。
引用只是获取了引用权,而不是获取所有权。

fn main() {
   
let s = String::from("Hello");

let s1 = &s; // 不可变引用

let s2 = &mut 2; // 可变引用

/*
这个程序不能编译通过。
因为不能同时存在 可变引用 和 不可变引用。
*/
}

引用与变量一样,也是默认为不可变。
不仅是原来的变量是可变就可以,必须是引用也是可变的,即在使用let s1 = &mut s 或传递参数 &mut s

fn main() {
   
    let mut s = String::from("hello, ");

    push_str(&mut s)
}

fn push_str(s: &mut String) {
   
    s.push_str("world")
}

解引用

fn main() {
   
let s = String::from("hello");

let s1 = &s; // s 的 不可变引用

println!("{}",*s1);
}

可以在一个引用作用域中存在多个不可变引用,但只能存在一个可变引用。
引用的作用域是从引用开始,到该引用的最后一次使用。

fn main() {
   
   let mut s = String::from("hello");

    let r1 = &s;
    let r2 = &s;
    println!("{} and {}", r1, r2);
    // 新编译器中,r1,r2作用域在这里结束

    let r3 = &mut s;
    println!("{}", r3);
} // 老编译器中,r1、r2、r3作用域在这里结束
  // 新编译器中,r3作用域在这里结束

可变引用只能存在一个。直到该引用结束,才可以使用另一个。
在一个可变引用的引用作用域结束之间,无法创建第二个可变引用。

不能从一个不可变引用上借用可变。可以从可变对象上借用可变。

Rust 不允许出现 悬垂引用,即空的引用。悬垂引用会再编译时被检测出来 。

fn main() {
   
    let reference_to_nothing = dangle();
}

fn dangle() -> &String {
   
    let s = String::from("hello");

    &s
}

/*
编译不能通过,因为返回的引用指针是空的,
这种情况更推荐转移所有权。
**/

借用规则

  • 同一时刻(在当前作用域中),只能拥有一个可变引用,或多个不可变引用。
  • 引用必须总是有效的。

ref

ref& 类似,可以用来获取一个值的引用。


fn main() {
   
    let c = '中';

    let r1 = &c;
    let ref r2 = c;

    assert_eq!(*r1, *r2);
    
    // 判断两个内存地址的字符串是否相等
    assert_eq!(get_addr(r1),get_addr(r2));
}

// 获取传入引用的内存地址的字符串形式
fn get_addr(r: &char) -> String {
   
    format!("{:p}", r)
}

ref 同样获取c的引用,而且指向了同一个内存地址。
请添加图片描述

相关推荐

  1. Rust 圣经 阅读 所有权和借用

    2024-01-05 10:28:04       33 阅读
  2. rust引用-借用机制扩展

    2024-01-05 10:28:04       19 阅读
  3. Rust引用借用和所有权详解

    2024-01-05 10:28:04       32 阅读
  4. Rust引用借用 vs 原始指针

    2024-01-05 10:28:04       17 阅读
  5. Rust】——引用循环内存泄漏

    2024-01-05 10:28:04       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-05 10:28:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-05 10:28:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-05 10:28:04       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-05 10:28:04       20 阅读

热门阅读

  1. 购买的服务器很卡要怎么办

    2024-01-05 10:28:04       35 阅读
  2. 【我的Rust库】get_local_info 0.1.5发布

    2024-01-05 10:28:04       40 阅读
  3. flink如何写入es

    2024-01-05 10:28:04       42 阅读
  4. 【Linux】不常用命令记录

    2024-01-05 10:28:04       40 阅读
  5. Openharmony hdc和adb指令对应

    2024-01-05 10:28:04       41 阅读
  6. K-均值聚类(K-means clustering)

    2024-01-05 10:28:04       35 阅读
  7. 腾讯云导入导出镜像官方文档

    2024-01-05 10:28:04       44 阅读
  8. (每日持续更新)jdk api之BufferedReader基础

    2024-01-05 10:28:04       39 阅读
  9. 云原生系列Go语言篇-标准库 Part 1

    2024-01-05 10:28:04       33 阅读
  10. OpenCV 安装概述

    2024-01-05 10:28:04       34 阅读