Rust学习——所有权、引用和借用
697 字
3 分钟
Rust学习——所有权、引用和借用
- 1Rust学习——所有权、引用和借用本文
所有权
所有权所要解决的,是栈上的变量持有堆上的资源所带来的一系列问题(如悬垂引用、二次释放等)。
let s = String::from("abcde");在这个例子里,栈上的s拥有堆上的“abcde”的所有权。
所有权的转移
在Cpp中,以下代码实现了字符串的赋值操作。
String s1 = "abcde";String s2 = s1;在这个代码里,s2相当于复制了s1字符串的字符内容,即完成了一次深拷贝。但在rust中:
let s1 = String::from("abcde");let s2 = s1;此时不同于cpp,它将s1对堆上”abcde”资源的所有权转移给了s2。此时s1不再有效,即s1不再持有任何资源。换句话来说,Rust永远也不会自动创建资源的“深拷贝”。
另外一个例子:
let x = 1;let y = x;x和y持有的资源全部在栈上,因此没有发生所有权的转移,而是将x的值复制给了y(它们实际上了实现了Copy的特征,因而可以直接复制而不是转移所有权)。
值得注意的是,不可变引用&T也是可以直接Copy的,但&mut T不行(&T的持有者对资源只读,因此非常安全)
函数传值与返回
函数传值和返回的过程也会伴随所有权的转移。
fn takes_ownership(s:String){ printfln!("{}",s);}
fn main(){ let str = String::from("abcde"); takes_ownership(str);}takes_ownership函数取得了str原本持有的资源的所有权。
fn return_str() -> { String::from("abcde")}
fn main(){ let s = return_str();}s取得了return_str返回的字符串资源的所有权。
引用和借用
获取变量引用的行为,就叫做借用
引用允许我们使用值,但是不获取所有权,自然也不会发生所有权的转移
不可变引用和可变引用
不可变引用相当于对资源只读,而可变引用让你对资源除了可读还可写。
因此,同一作用域内,有以下规则:
- 不可变引用
&T数量不限制 - 可变引用
&mut T只能有1个 - 可变引用和不可变引用不能同时存在
- 很多个读者共存不会影响彼此
- 很多个写者共存会导致数据竞争
- 写者修改资源会影响读者
所有权和引用的联系
围绕一个资源的所有操作无非是读和写。
持有某个资源所有权的变量当然可以对资源读和写。
但有时候将资源的所有权倒腾来倒腾去非常麻烦,这时候引用给我们提供了一个轻量化的选择——不可变引用负责读,可变引用负责写。
文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!
Rust学习——所有权、引用和借用
https://blog-zeta-seven-36.vercel.app/posts/rust-learn-ownership-1/相关文章智能推荐
1
Firefly 代码块示例
文章示例在Firefly中使用表达性代码的代码块在 Markdown 中的外观。
2
Firefly 布局系统详解
博客指南深入了解 Firefly 的布局系统,包括侧边栏布局(左侧/双侧)和文章列表布局(列表/网格),以及自适应网格列数。
3
Firefly Wiki Link 内部链接示例
博客指南在 Firefly 文章中使用 Obsidian 风格的 Wiki Link 内部链接,并自动生成文章链接卡片。
4
Firefly 一款清新美观的 Astro 博客主题模板
文章示例Firefly 是一款基于 Astro 框架和 Fuwari 模板开发的清新美观且现代化个人博客主题模板,专为技术爱好者和内容创作者设计。该主题融合了现代 Web 技术栈,提供了丰富的功能模块和高度可定制的界面,让您能够轻松打造出专业且美观的个人博客网站。
5
Firefly 简单使用指南
博客指南如何使用 Firefly 博客模板。
随机文章随机推荐














