MST

星途 面试题库

面试题:Rust泛型结构体与方法的复杂实现

定义一个泛型结构体 `Pair<T, U>`,包含两个泛型成员 `first` 和 `second`。为这个结构体实现方法,其中一个方法 `swap` 用于交换 `first` 和 `second` 的值,另一个方法 `combine` 用于将 `first` 和 `second` 以某种特定逻辑(例如字符串拼接,如果 `T` 和 `U` 都是字符串类型;如果是数字类型则相加等)组合并返回结果。要求根据不同的类型实现合适的逻辑,描述如何通过特征边界和泛型关联类型来完成这些功能。
14.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

以下以 Rust 语言为例:

// 定义泛型结构体 Pair
struct Pair<T, U> {
    first: T,
    second: U,
}

// 为 Pair 结构体实现方法
impl<T, U> Pair<T, U> {
    // 交换 first 和 second 的值
    fn swap(&mut self) {
        std::mem::swap(&mut self.first, &mut self.second);
    }
}

// 定义一个 trait 来处理组合逻辑
trait Combine<T, U> {
    type Output;
    fn combine(t: T, u: U) -> Self::Output;
}

// 实现字符串拼接的 Combine trait
impl Combine<&str, &str> for Pair<&str, &str> {
    type Output = String;
    fn combine(t: &str, u: &str) -> Self::Output {
        t.to_string() + u
    }
}

// 实现数字相加的 Combine trait
impl Combine<i32, i32> for Pair<i32, i32> {
    type Output = i32;
    fn combine(t: i32, u: i32) -> Self::Output {
        t + u
    }
}

// 实现方法 combine
impl<T, U> Pair<T, U>
where
    Self: Combine<T, U>,
{
    fn combine(&self) -> <Self as Combine<T, U>>::Output {
        Combine::combine(&self.first, &self.second)
    }
}

解释:

  1. 泛型结构体定义:首先定义了一个泛型结构体 Pair,它包含两个泛型成员 firstsecond
  2. swap 方法:通过 std::mem::swap 来交换 firstsecond 的值。
  3. 特征边界和泛型关联类型
    • 定义了 Combine trait,它有一个泛型关联类型 Output 表示组合后的结果类型,还有一个 combine 方法用于执行组合逻辑。
    • 分别为 &stri32 类型实现了 Combine trait,定义了不同类型的组合逻辑。
    • combine 方法的 impl 块中,使用特征边界 Self: Combine<T, U> 来限制只有实现了 Combine trait 的 Pair 类型才能调用 combine 方法,并通过 <Self as Combine<T, U>>::Output 获取组合结果的类型。