MST
星途 面试题库

面试题:Rust中引用与可变性冲突场景分析

在Rust中,假设有一个结构体`Point { x: i32, y: i32 }`,现在有一个函数,接收这个结构体的引用并尝试修改其中一个字段,同时另一个函数需要读取这个结构体的所有字段。请描述在不违反Rust借用规则的情况下如何实现,写出代码示例并解释借用规则是如何保证内存安全的。
44.5万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
struct Point {
    x: i32,
    y: i32,
}

// 修改字段的函数
fn modify_point(point: &mut Point) {
    point.x = 10;
}

// 读取所有字段的函数
fn read_point(point: &Point) {
    println!("x: {}, y: {}", point.x, point.y);
}

fn main() {
    let mut p = Point { x: 0, y: 0 };

    modify_point(&mut p);
    read_point(&p);
}

借用规则解释

  1. 唯一性:在任何给定的时间,对于特定数据,只能有一个可变引用(&mut),这确保了不会出现数据竞争。在modify_point函数中,我们传入&mut Point,这是对Point结构体的可变引用。在这个可变引用存活期间,不能有其他任何引用(包括不可变引用&)指向相同的数据。
  2. 不可变性:可以有多个不可变引用(&),但不能同时存在可变引用。在read_point函数中,我们传入&Point,这是不可变引用。多个函数可以同时读取数据,但在读取期间,数据不会被修改,从而保证了内存安全。
  3. 作用域:引用的作用域决定了它的生命周期。一旦引用离开其作用域,就不再有效。在main函数中,modify_point调用结束后,可变引用的作用域结束,此时可以安全地创建不可变引用供read_point使用,从而避免了数据竞争和内存安全问题。