MST

星途 面试题库

面试题:Rust中如何在impl块间复用结构体方法

假设有一个Rust结构体`Point`,包含`x`和`y`两个`i32`类型的字段。现在要求创建两个`impl`块,一个`impl`块提供计算点到原点距离的方法,另一个`impl`块提供将点坐标翻倍的方法。请展示如何实现这两个`impl`块,并说明在不同`impl`块间复用相关功能的方式(比如通过trait等)。
44.1万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

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

// 第一个impl块,计算点到原点距离的方法
impl Point {
    fn distance_to_origin(&self) -> f64 {
        (self.x.pow(2) + self.y.pow(2)) as f64).sqrt()
    }
}

// 第二个impl块,将点坐标翻倍的方法
impl Point {
    fn double_coordinates(&mut self) {
        self.x *= 2;
        self.y *= 2;
    }
}

// 复用相关功能的示例,通过trait
trait PointOps {
    fn scale(&mut self, factor: i32);
}

impl PointOps for Point {
    fn scale(&mut self, factor: i32) {
        self.x *= factor;
        self.y *= factor;
    }
}

// 改进后的将点坐标翻倍的方法,复用trait中的功能
impl Point {
    fn double_coordinates_using_trait(&mut self) {
        self.scale(2);
    }
}
  1. 第一个impl
    • 实现了distance_to_origin方法,该方法使用勾股定理计算点到原点的距离,结果为f64类型。
  2. 第二个impl
    • 实现了double_coordinates方法,该方法直接修改结构体实例的xy字段,将其翻倍。
  3. 复用相关功能
    • 定义了PointOps trait,其中有一个scale方法,用于按给定因子缩放点的坐标。
    • Point结构体实现了PointOps trait。
    • 在第二个impl块中可以定义新的方法double_coordinates_using_trait,通过调用trait中实现的scale方法来复用相关功能,将点的坐标翻倍。