MST

星途 面试题库

面试题:Rust结构体其他初始化方式之专家题

设计一个复杂的Rust结构体层次结构,包括父结构体和多个子结构体。要求通过自定义的初始化方式,在初始化子结构体时,不仅能初始化自身特有的字段,还能自动正确初始化从父结构体继承(假设Rust有类似继承概念,这里通过合理方式模拟)而来的字段。展示如何通过灵活运用Rust的结构体初始化特性,实现高效、安全且易于理解的初始化过程,写出详细代码及注释说明。
16.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
// 定义父结构体
struct Parent {
    common_field: String,
}

// 父结构体的初始化函数
impl Parent {
    fn new_common_field(common_field: &str) -> Self {
        Parent {
            common_field: common_field.to_string(),
        }
    }
}

// 定义第一个子结构体,模拟继承自父结构体
struct Child1 {
    // 包含父结构体的实例,以模拟继承
    parent: Parent,
    child1_specific_field: i32,
}

// 子结构体Child1的初始化函数
impl Child1 {
    fn new(child1_specific_field: i32, common_field: &str) -> Self {
        Child1 {
            parent: Parent::new_common_field(common_field),
            child1_specific_field,
        }
    }
}

// 定义第二个子结构体,模拟继承自父结构体
struct Child2 {
    // 包含父结构体的实例,以模拟继承
    parent: Parent,
    child2_specific_field: f64,
}

// 子结构体Child2的初始化函数
impl Child2 {
    fn new(child2_specific_field: f64, common_field: &str) -> Self {
        Child2 {
            parent: Parent::new_common_field(common_field),
            child2_specific_field,
        }
    }
}

可以这样使用这些结构体:

fn main() {
    let child1 = Child1::new(42, "Hello from Child1");
    let child2 = Child2::new(3.14, "Hello from Child2");

    println!("Child1: common_field = {}, child1_specific_field = {}", child1.parent.common_field, child1.child1_specific_field);
    println!("Child2: common_field = {}, child2_specific_field = {}", child2.parent.common_field, child2.child2_specific_field);
}

在上述代码中:

  1. 父结构体Parent:定义了一个公共字段common_field,并提供了一个初始化函数new_common_field来创建Parent实例。
  2. 子结构体Child1Child2:通过在结构体中包含Parent实例来模拟继承。每个子结构体都有自己特有的字段,并提供了初始化函数new。在new函数中,先调用父结构体的初始化函数来初始化parent字段,再初始化自身特有的字段。
  3. main函数:展示了如何创建Child1Child2的实例,并打印出它们的字段值。这种方式利用了Rust结构体的组合特性,以一种高效、安全且易于理解的方式实现了类似继承的结构体层次结构初始化。