title | tags | |||
---|---|---|---|---|
5. Ownership |
|
本章是Rust
语言精髓的核心所在:所有权、借用和引用。这些概念是Rust
安全内存管理的基石,帮助开发者写出安全且高效的代码,避免了传统语言中常见的错误,如空指针访问和数据竞争。
在Rust
中,所有权系统的核心规则可以归纳为三条:
- 每一个值都被其所有者变量所拥有。
- 值在任意时刻只能被一个所有者拥有。
- 当所有者离开作用域时,值将被丢弃。
这些规则确保内存安全无泄漏,同时避免手动管理内存。
fn main() {
let s1 = String::from("hello"); // s1 是 hello 对象的所有者
let s2 = s1; // 所有权从 s1 转移至 s2,s1将变得不可用
// println!("{s1}"); // 错误:s1 不再持有字符串
display(s2); //s2 将所有权转让给函数参数s,s2将变得不可用
// println!("{s2}"); // 错误:s2不可用
}
fn display(s:String){
println!("{:?}",s);
}
在Rust
中,借用是指通过引用来获得数据的访问权,而不是所有权,用符号 &
表示。借用使得可以在不转移所有权的情况下,让多个部分同时访问相同的数据。借用分为两种:不可变借用和可变借用。
- 不可变借用:允许多次借用,但借用期间不能修改数据,
Rust
中默认为不可变借用。 - 可变借用:允许数据被修改,但在同一时间内只能有一个可变借用。
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1); // s1 发生不可变借用,函数只能读取但不能修改 s1
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize { // s 是对 s1 的引用
s.len()
}
fn main() {
let mut s = String::from("hello");
change(&mut s); // s 被可变借用,函数可以修改 s
println!("{}", s);
}
fn change(some_string: &mut String) -> &mut String{
some_string.push_str(", wtf!");
some_string
}
通过如上例子你应该对Rust
的核心概念:所有权、借用有了基本的理解。掌握这些概念对于高效利用Rust
语言特性至关重要,可以帮你编写出更安全和高效的代码。如果有任何疑问或需要进一步的解释,请随时提出!