rust references ownership borrowing

rust references ownership borrowing

Rust 中的 所有权(Ownership)借用(Borrowing)引用(References) 是该语言最核心的概念之一,它们保证了内存安全而不需要垃圾回收器。

所有权(Ownership)

在 Rust 中,每个值都有一个明确的所有者,且在同一时间只能有一个所有者。值的生命周期由其所有者的作用域决定。

规则:

  • 每个值有一个所有者。
  • 每个值在同一时刻只能有一个所有者。
  • 当所有者离开作用域时,Rust 会自动清理该值。

这种方式通过 自动内存管理 来避免了手动内存管理的错误(如悬挂指针、内存泄漏等)。

示例:

1
2
3
4
5
6
7
8
9
fn main() {
let s = String::from("hello"); // s 是 String 的所有者
take_ownership(s); // s 的所有权转移给了 take_ownership 函数
// println!("{}", s); // 编译错误:s 已经不再是所有者,不能再访问
}

fn take_ownership(s: String) {
println!("{}", s); // 使用 s
} // 当 s 离开作用域时,Rust 会自动释放内存

借用(Borrowing)

借用是指让一个函数或作用域能够访问某个值,但不获取该值的所有权。Rust 支持两种类型的借用:

  • 不可变借用(Immutable Borrowing):多个地方可以同时不可变借用一个值,但无法修改该值。
  • 可变借用(Mutable Borrowing):一个地方可以可变借用一个值,并修改它,但在同一时刻不能有其他的借用(可变或不可变)。

不可变借用:

  • 可以有多个不可变引用。
  • 值不可修改。
  • 引用不会转移所有权。

示例:

1
2
3
4
5
6
7
8
fn main() {
let s = String::from("hello");
let r1 = &s; // 不可变借用
let r2 = &s; // 仍然可以借用

println!("{}", r1); // 使用 r1
println!("{}", r2); // 使用 r2
} // s 在这里仍然有效

可变借用:

  • 只能有一个可变引用。
  • 在可变借用存在的情况下,不能同时存在其他的借用(可变或不可变)。
  • 可变引用允许修改值。

示例:

1
2
3
4
5
6
fn main() {
let mut s = String::from("hello");
let r1 = &mut s; // 可变借用
r1.push_str(", world!"); // 修改 s
println!("{}", r1); // 使用可变引用 r1
} // r1 离开作用域后,s 可以继续使用

引用(References)

引用是对值的借用,不会取得所有权。Rust 中的引用有两种:

  • 不可变引用(&T):允许只读访问。
  • 可变引用(&mut T):允许修改值。

引用规则:

  • 不可变引用:可以同时存在多个不可变引用,但不能有可变引用。
  • 可变引用:在同一时间只能有一个可变引用,且不能同时有任何不可变引用。

Rust 的借用规则通过编译时的检查确保了数据的访问在多线程环境下是安全的。

示例:

1
2
3
4
5
6
7
8
fn main() {
let mut s = String::from("hello");

let r1 = &mut s; // 可变借用
r1.push_str(", world!");

println!("{}", r1); // 使用可变引用
} // 当 r1 离开作用域时,s 可以被使用
作者

1uciuszzz

发布于

2024-11-29

更新于

2024-11-29

许可协议

评论