gpt4 book ai didi

enums - Rust 宏从另一个枚举生成枚举

转载 作者:行者123 更新时间:2023-12-03 11:47:50 25 4
gpt4 key购买 nike

我正在尝试解决代码重复的问题,以使其不易出错。
我正在使用不同的数据源,每个数据源都有一些特定的属性。这是我的数据模型的样子:

mod sources {
pub struct Ds1;
pub struct Ds2;
//hundreds more

pub trait DsTypeTrait{
type Input;
type Output;
}

impl DsTypeTrait for Ds1 {
type Input = u32;
type Output = u32;
}

impl DsTypeTrait for Ds2 {
type Input = String;
type Output = String;
}

//etc...

enum DataSource{
Ds1(Ds1),
Ds2(Ds2),
//...
}
}
因此,任何时候有人想要添加对新数据源的支持,他们都需要将其添加到 enum DataSource . 问题 解决方案是,如果另一个模块包含一些自定义数据格式,例如 DataSource通信需要在极易出错的 2 个地方添加 DataSource。例如:
mod some_other {
use super::sources::*;

struct DataSourceDataInputOutput<Ds: DsTypeTrait>{
input: <Ds as DsTypeTrait>::Input,
output: <Ds as DsTypeTrait>::Output
}

enum DataSourceIO{
Ds1(DataSourceDataInputOutput<Ds1>),
Ds2(DataSourceDataInputOutput<Ds2>)
//Extremely easy to forget to add here
}
}
问题:鉴于 enum DataSource是否可以编写一个宏来生成 enum DataSourceIO自动并避免修改 enum DataSourceIO每次手动 new DataSource被添加?

最佳答案

似乎枚举解析是一个复杂的问题,因此在宏本身中移动 DataSource 实际声明是合理的。这是我想出的:

#[macro_use]
mod sources {
macro_rules! data_sources {
($name:ident, $type:tt) => {
enum $name{
Ds1($type<Ds1>),
Ds2($type<Ds2>)
}
}
}

//...
}

mod some_other {

struct DataSourceDataInputOutput<Ds: DsTypeTrait>{
input: <Ds as DsTypeTrait>::Input,
output: <Ds as DsTypeTrait>::Output
}

data_sources!(Test, DataSourceDataInputOutput);

fn test_fn() {
let ds1io: DataSourceDataInputOutput<Ds1> = DataSourceDataInputOutput{
input: 1,
output: 2
};
let test = DataSourceIO::Ds1(ds1io); //works ok
}

}

关于enums - Rust 宏从另一个枚举生成枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63942938/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com