Rust – 参考与借用
正如 Rust 所有权规则所说,一次只有一个所有者,但在某些情况下,我们可能需要对数据执行操作而不影响其原始值。这是通过借贷来完成的。借用就像一般来说,当我们借东西时,我们用完它,我们还给它,但这并不使我们成为数据的所有者。引用是作为参数传递给函数的地址,它们总是以与号(&)开头。
参考规则
- 在任何给定时间,您可以拥有一个可变引用或任意数量的不可变引用。
- 引用必须始终有效。
举个例子
Rust
fn main() {
let gfg = String::from("geeksforgeeks");
// gfg is passed as reference
let length = calculate_length(&gfg);
// gfg goes out of scope
println!("The length of '{}' is {}.", gfg, length);
}
fn calculate_length(gfg_len: &String) -> usize {
// gfg_len variable expecting string reference
// returning length
gfg_len.len()
}
Rust
fn main() {
let old = String::from("geeks");
complete(&old);
}
fn complete(new: &String) {
new.push_str(", forgeeeks");
println!("{}", new);
}
Rust
fn main() {
let old = String::from("geeksforgeeks");
change_reference(&old);
println!("Old name = {}",old);
}
fn change_reference(new: &String) {
*new = String::from("GeeksForGeeks");
println!("New name = {}", new);
}
Rust
fn main() {
let mut old = String::from("geeksforgeeks");
println!("Old name = {}",old);
change_reference(&mut old);
}
fn change_reference(new: &mut String) {
*new = String::from("GeeksForGeeks");
println!("New name = {}", new);
}
变量gfg包含一个字符串并传递给函数calculate_length作为引用,这意味着gfg_len借用变量gfg的值来计算其长度,并在函数的末尾返回借用的值。然后该函数返回传递的引用字符串的长度。
参考文献的视觉表示:
现在让我们尝试更改借用程序的值,看看我们得到了什么
锈
fn main() {
let old = String::from("geeks");
complete(&old);
}
fn complete(new: &String) {
new.push_str(", forgeeeks");
println!("{}", new);
}
引用和可变性
就像 Rust 中的变量一样,默认情况下所有引用都是可变的。让我们尝试更改我们引用的值。
锈
fn main() {
let old = String::from("geeksforgeeks");
change_reference(&old);
println!("Old name = {}",old);
}
fn change_reference(new: &String) {
*new = String::from("GeeksForGeeks");
println!("New name = {}", new);
}
这会产生错误,因为借用的值无法修改,因为我们不是该值的所有者。
可变引用
Rust 支持可变引用,这意味着如果它是可变变量,我们可以更改它引用的值。我们如何使用可变引用有一些限制。
- 您只能有一个对特定范围内特定值的可变引用,以防止数据竞争
- 如果我们的程序中存在不可变引用,那么我们就不能有一个指向相同值的可变引用。
- 您可以在特定范围内拥有多个不可变引用,因为我们无法更改它引用的值
让我们把上面的程序改成有效
锈
fn main() {
let mut old = String::from("geeksforgeeks");
println!("Old name = {}",old);
change_reference(&mut old);
}
fn change_reference(new: &mut String) {
*new = String::from("GeeksForGeeks");
println!("New name = {}", new);
}