MST

星途 面试题库

面试题:Rust宏在模块化编程中的应用

假设你正在开发一个模块化的Rust项目,模块A需要定义一些通用的结构体和方法,模块B要复用这些定义,同时还想根据自身需求通过宏进行一些扩展。请描述实现这个场景的大致思路,并给出关键代码示例。
45.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 定义通用模块A:在模块A中定义通用的结构体和方法。
  2. 模块B复用模块A:在模块B中通过use语句引入模块A。
  3. 宏扩展:编写宏在模块B中根据需求对模块A的内容进行扩展。

关键代码示例

模块A代码(src/lib.rs

// 模块A定义通用结构体
pub struct CommonStruct {
    pub data: i32,
}

// 模块A定义通用方法
impl CommonStruct {
    pub fn new(data: i32) -> Self {
        CommonStruct { data }
    }

    pub fn get_data(&self) -> i32 {
        self.data
    }
}

模块B代码(src/bin/main.rs

// 引入模块A
use crate::CommonStruct;

// 定义宏
macro_rules! extended_function {
    ($struct:ident) => {
        impl $struct {
            pub fn extended_method(&self) -> i32 {
                self.get_data() * 2
            }
        }
    };
}

fn main() {
    let instance = CommonStruct::new(5);
    println!("Original data: {}", instance.get_data());

    // 使用宏进行扩展
    extended_function!(CommonStruct);
    println!("Extended data: {}", instance.extended_method());
}

在上述代码中,模块A定义了CommonStruct结构体及其基本方法。模块B通过use引入模块A,并使用宏extended_functionCommonStruct添加了新的方法extended_method