MST
星途 面试题库

面试题:Rust函数参数中可变引用与不可变引用的共存问题

编写一个Rust函数,该函数接受一个可变的结构体实例的引用,结构体中有一个字符串字段。函数需要先打印结构体中的字符串内容(使用不可变引用操作),然后修改该字符串内容(使用可变引用操作)。说明在Rust中如何处理同一作用域内可变引用和不可变引用共存的规则及可能遇到的编译错误,以及如何解决这些错误。
16.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct MyStruct {
    my_string: String,
}

fn modify_string(s: &mut MyStruct) {
    // 使用不可变引用打印字符串
    println!("原始字符串: {}", &s.my_string);

    // 使用可变引用修改字符串
    s.my_string.push_str(" 修改后的内容");
}

在Rust中,同一作用域内可变引用和不可变引用共存的规则如下:

  • 规则
    • 同一时间内,对同一数据只能有一个可变引用。
    • 同一时间内,可以有多个不可变引用。
    • 不可变引用和可变引用不能同时存在。

可能遇到的编译错误: 如果违反上述规则,会遇到编译错误,错误信息通常会提示类似于 cannot borrow <variable> as mutable because it is also borrowed as immutable,即不能将某个变量作为可变引用借用,因为它已经被作为不可变引用借用了。

解决方法

  1. 分开作用域:将不可变引用和可变引用放在不同的作用域中,这样它们就不会同时存在。例如:
{
    let s = &s.my_string;
    println!("原始字符串: {}", s);
}
s.my_string.push_str(" 修改后的内容");
  1. 提前结束不可变借用:在进行可变借用之前,确保不可变借用已经结束。例如,如果不可变借用是通过函数调用返回的,可以在可变借用之前让该函数返回值超出作用域。