📜  Rust – 参考与借用

📅  最后修改于: 2022-05-13 01:55:24.829000             🧑  作者: Mango

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);
}