MST

星途 面试题库

面试题:Rust借用机制中所有权转移与借用的区别

请详细阐述在Rust中,所有权转移和借用的概念及它们之间的区别,并通过具体代码示例说明在哪些场景下会发生所有权转移,哪些场景下会使用借用。
41.4万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

所有权转移

  • 概念:在Rust中,每个值都有一个变量作为其所有者。当一个变量超出其作用域时,Rust会自动调用drop函数来释放该变量所占用的资源。所有权转移指的是一个变量将其对值的所有权转移给另一个变量。当所有权转移后,原来的变量不再拥有对该值的所有权,不能再使用该值。
  • 示例
fn main() {
    let s1 = String::from("hello");
    let s2 = s1; // s1的所有权转移给s2
    // println!("{}", s1); // 这一行会报错,因为s1不再拥有所有权
    println!("{}", s2);
}

在上述代码中,s1将其对String类型值的所有权转移给了s2,之后再使用s1就会报错。

借用

  • 概念:借用允许我们在不转移所有权的情况下使用值。借用分为不可变借用和可变借用。不可变借用允许多个变量同时读取值,但不允许修改值;可变借用只允许一个变量对值进行修改,并且在可变借用期间,不能有其他借用。
  • 不可变借用示例
fn main() {
    let s = String::from("hello");
    let len = calculate_length(&s);
    println!("The length of '{}' is {}", s, len);
}

fn calculate_length(s: &String) -> usize {
    s.len()
}

在这个例子中,calculate_length函数接受一个对String的不可变借用。函数可以读取s的值,但不能修改它。主函数在借用结束后仍然可以使用s

  • 可变借用示例
fn main() {
    let mut s = String::from("hello");
    change(&mut s);
    println!("{}", s);
}

fn change(s: &mut String) {
    s.push_str(", world");
}

这里,change函数接受一个对String的可变借用。函数可以修改s的值。注意,s必须是mut可变的,并且在可变借用期间,不能有其他对s的借用。

区别

  • 所有权转移:所有权从一个变量转移到另一个变量,原变量失去对值的所有权,不能再使用该值。
  • 借用:借用不转移所有权,只是在借用期间临时使用值。不可变借用允许多个同时读取,可变借用只允许一个修改,并且有借用规则来避免数据竞争。借用结束后,原变量仍然拥有所有权,可以继续使用值。