Rust系列(11):引用和借用
  oS1xgoxjr0QZ 2023年11月02日 31 0


今天学习的内容是 Rust 中所有权的另一个知识点,借用和引用

先引入一个场景,有一个 reverse 函数,用于将一个字符串值进行反转:

fn reverse(s: String) -> String {
  s.chars().rev().collect()
}

fn main() {
  let s1 = String::from("hello");
  let s2 = reverse(s1);
  println!("{} {}", s1, s2);
}

按照前面所学的所有权的知识,在调用 reverse 时,变量 s1 对字符串值的所有权就交给了函数,所以当前作用域下 s1 不再有效,打印 s1 就会报错

那么如果 s1 还有用处,就是需要打印 s1 呢?

Rust 提供了引用的功能,来实现这个需求。

引用

声明变量时,和之前没有区别:

let s1 = String::from("hello");

在函数调用传参时,需要在实参前面加上符号 & 表示这是一个引用类型,表示是对一个值的引用,它能允许在不转移所有权的情况下使用值

let s2 = reverse(&s1);

这里的 &s1 允许在不转移所有权的前提下,创建一个指向 s1 值的引用。

引用不拥有值的所有权,所以将 &s1 引用作为参数传给函数后,在当前作用域下,变量 s1 依然拥有字符串值的所有权,这样 s1 就能正常打印而不会报错了。

借用

函数内部如何使用引用呢?

函数在声明时,在参数类型前加上同一个符号 & ,表示该参数的类型是一个引用。

fn reverse1(s: &String) -> String {
  s.chars().rev().collect()
}

站在函数的角度,这种通过引用传递参数给函数的方法被称为借用(borrowing)。

引用和借用,就是对同一件事物的不同表达。

引用的规则

从上面使用引用的示例中,可以总结出一些规则:

1.使用引用类型不会获得所有权(所有权仍保留在原来的作用域中)

2.默认情况下引用是不可变的(只能读取值,不能修改值)

3.同一时间最多只能存在一个可变引用(防止多线程下的数据竞争)

小结

本文介绍了 Rust 中所有权中有一个很重要的概念,引用和借用。通过引用,可以避免所有权的转移,方便在作用域下对变量的使用,在开发中用的非常多。


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  oS1xgoxjr0QZ   2023年11月02日   42   0   0 数组Rust
  oS1xgoxjr0QZ   2023年11月02日   31   0   0 Rust
  dBFTbkVLMBge   2023年11月02日   29   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   39   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   25   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   41   0   0 Rust
  oS1xgoxjr0QZ   2023年11月02日   48   0   0 Rust
  y5zqVixaDLkE   2023年11月02日   34   0   0 RustmysqlPostgreSQL
oS1xgoxjr0QZ