《Rust 编程第一课》 学习笔记 Day 17

103 阅读2分钟

大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 Go、Lua。第十七天还是继续和大家一起学习 Rust😊

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 1 天,点击查看活动详情

因为开发者不想值的所有权转移,但是又没有实现 Copy trait 而无法使用 Copy 语义,所以衍生出 Borrow 语义

Borrow

Borrow 有点像租用的意思,可以让其他上下文拥有值临时的使用权。Borrow 语义使用 & 和 &mut 来实现,默认情况下,Borrow 只拥有只读权限

引用和借用(租用)的区别是:引用相当于共享了所有权,而借用只是获得临时使用权,而不破坏值的单一所有权限制

Rust 没有传引用(pass-by-reference)的概念,所有的参数传递都是值传递(pass-by-value),传值就是copy栈上的值,不论栈上存的是“指针/地址”还是“值”。必须显示将某个数据的引用传给另一个函数

这一限制以一种非常小心谨慎的方式允许可变性,防止同一时间对同一数据存在多个可变引用。因为大部分语言中变量任何时候都是可变的。这个限制的好处是 Rust 可以在编译时就避免数据竞争。数据竞争data race)类似于竞态条件,它可由这三个行为造成:

  • 两个或更多指针同时访问同一数据。
  • 至少有一个指针被用来写入数据。
  • 没有同步数据访问的机制。

数据竞争会导致未定义行为,难以在运行时追踪,并且难以诊断和修复;Rust 避免了这种情况的发生,因为它甚至不会编译存在数据竞争的代码!

悬垂引用 Dangling References

在具有指针的语言中,很容易通过释放内存时保留指向它的指针而错误地生成一个 悬垂指针dangling pointer),所谓悬垂指针是其指向的内存可能已经被分配给其它持有者。相比之下,在 Rust 中编译器确保引用永远也不会变成悬垂状态:当你拥有一些数据的引用,编译器确保数据不会在其引用之前离开作用域。