Rust所有权与借用规则深度解析:从踩坑到理解

张开发
2026/4/21 6:56:52 15 分钟阅读

分享文章

Rust所有权与借用规则深度解析:从踩坑到理解
Rust所有权与借用规则深度解析从踩坑到理解前言大家好我是第一程序员名字大人很菜一个正在跟Rust所有权和生命周期死磕的后端转Rust萌新。最近这段时间我被Rust的所有权系统搞得焦头烂额今天终于有了一些理解赶紧来分享给大家。希望能帮助到同样在学习Rust的小伙伴们也欢迎大佬们轻喷指正什么是所有权刚开始学Rust的时候我对所有权的概念完全懵圈。什么是所有权为什么要有所有权这跟我之前学的其他语言完全不一样啊经过一段时间的学习我终于明白了所有权是Rust用来管理内存的一套规则不需要垃圾回收器就能保证内存安全。所有权的三大规则每个值都有一个所有者同一时间只能有一个所有者当所有者离开作用域时值会被自动丢弃听起来有点抽象让我们看个例子fn main() { let s1 String::from(hello); let s2 s1; // 这里发生了所有权转移s1不再有效 println!({}, s1); // 编译错误value borrowed here after move }刚开始写这段代码的时候我以为这是在复制字符串结果编译器报错了。后来才明白这是因为Rust为了避免双重释放的问题默认是移动move而不是复制。当我们把s1赋值给s2时s1的所有权就转移给了s2s1就不再有效了。借用规则既然直接转移所有权会带来很多不便Rust提供了借用borrowing机制允许我们临时使用值而不获取所有权。不可变借用fn main() { let s1 String::from(hello); let len calculate_length(s1); // 不可变借用 println!(The length of {} is {}., s1, len); // 这里s1仍然有效 } fn calculate_length(s: String) - usize { s.len() }这里的s1就是创建了一个不可变引用它允许我们读取值但不能修改它。可变借用如果我们需要修改借用的值就需要使用可变借用fn main() { let mut s String::from(hello); change(mut s); // 可变借用 println!({}, s); // 输出hello, world } fn change(some_string: mut String) { some_string.push_str(, world); }借用的规则同一时间只能有一个可变借用同一时间可以有多个不可变借用不可变借用和可变借用不能同时存在这些规则刚开始看起来很严格但正是这些规则保证了Rust的内存安全。常见踩坑与解决方案踩坑1悬垂引用fn dangle() - String { // 编译错误missing lifetime specifier let s String::from(hello); s // 试图返回局部变量的引用 }当函数结束时s会被销毁返回的引用就指向了一个无效的内存位置这就是悬垂引用。解决方案是直接返回值而不是引用。踩坑2可变借用与不可变借用冲突fn main() { let mut s String::from(hello); let r1 s; // 不可变借用 let r2 s; // 另一个不可变借用没问题 let r3 mut s; // 编译错误cannot borrow s as mutable because it is also borrowed as immutable println!({}, {}, and {}, r1, r2, r3); }解决方案是确保在创建可变借用之前所有的不可变借用都已经结束。实战案例实现一个简单的字符串处理函数让我们来实践一下所有权和借用规则实现一个简单的字符串处理函数fn main() { let mut text String::from( Hello, Rust! ); println!(原始字符串: {}, text); // 去除首尾空白 let trimmed trim_string(text); println!(去除空白后: {}, trimmed); // 转换为大写 to_uppercase(mut text); println!(大写字符串: {}, text); } // 不可变借用只读取不修改 fn trim_string(s: String) - String { s.trim().to_string() } // 可变借用修改原字符串 fn to_uppercase(s: mut String) { *s s.to_uppercase(); }学习心得理解所有权是学习Rust的关键所有权系统是Rust的核心特性也是最难以理解的部分。但一旦理解了你会发现它的设计非常巧妙。不要害怕编译器错误Rust的编译器错误信息非常友好它会告诉你具体的问题和解决方案。我现在已经养成了仔细阅读错误信息的习惯。多写代码多实践所有权和借用规则只有在实际代码中才能真正理解。我建议大家多写一些小例子尝试不同的场景看看编译器会给出什么错误。保持耐心学习Rust需要时间和耐心特别是对于转码的同学来说。我曾经因为所有权问题卡住好几天但坚持下来后现在已经能比较熟练地使用了。总结Rust的所有权和借用规则虽然一开始很难理解但它们是Rust安全性和性能的关键。通过本文的介绍希望能帮助大家对这些概念有更清晰的认识。保持学习保持输出今天终于搞懂了所有权哭死如果本文对你有帮助欢迎点赞、收藏也欢迎在评论区分享你的学习心得和问题。向大佬们低头学习参考资料Rust官方文档Rust程序设计语言中文版Rust By Example

更多文章