MST

星途 面试题库

面试题:Rust复合赋值运算符与自定义类型及运算符重载

定义一个Rust的自定义结构体Point,包含两个i32类型的字段x和y。为该结构体实现加法复合赋值运算符 += ,使得两个Point实例相加时,对应的x和y字段分别相加。然后编写一个函数,接收两个Point实例,使用 += 运算符对它们进行操作,并返回结果。请完整实现相关代码,并阐述在此过程中可能遇到的所有权和借用问题及如何解决。
15.2万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义Point结构体
struct Point {
    x: i32,
    y: i32,
}

// 为Point结构体实现+=运算符
impl std::ops::AddAssign for Point {
    fn add_assign(&mut self, other: Self) {
        self.x += other.x;
        self.y += other.y;
    }
}

// 定义函数接收两个Point实例并返回相加结果
fn add_points(p1: Point, p2: Point) -> Point {
    let mut result = p1;
    result += p2;
    result
}

所有权和借用问题及解决

  1. 所有权
    • add_points函数中,p1p2作为参数传递,所有权被转移到函数中。这意味着在函数内部,函数拥有这两个Point实例的所有权。
    • 函数返回result,此时result的所有权被转移给调用者。
  2. 借用
    • 在实现AddAssign trait时,self使用&mut引用,这是因为+=运算符通常会修改调用它的实例。other是值传递,因为它的所有权会被转移到add_assign方法内部,然后被消耗,这样可以避免不必要的复制。通过这种方式,既满足了对self的修改需求,又合理处理了other的所有权,避免了所有权和借用规则的冲突。