Enums Rust宏从另一个枚举生成枚举
我试图解决一个代码重复的问题,使它不那么容易出错 我正在使用不同的数据源,每个数据源都有一些特定的属性。以下是我的数据模型的外观:Enums Rust宏从另一个枚举生成枚举,enums,rust,macros,metaprogramming,Enums,Rust,Macros,Metaprogramming,我试图解决一个代码重复的问题,使它不那么容易出错 我正在使用不同的数据源,每个数据源都有一些特定的属性。以下是我的数据模型的外观: mod sources { pub struct Ds1; pub struct Ds2; //hundreds more pub trait DsTypeTrait{ type Input; type Output; } impl DsTypeTrait for Ds1 {
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数据源
。解决方案的问题是,如果另一个模块包含一些自定义数据格式,例如数据源
通信,则需要在极易出错的两个位置添加数据源。例如:
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
}
}
mod some\u other{
使用super::sources::*;
结构数据源数据输入输出{
输入:::输入,
输出:::输出
}
枚举数据源{
Ds1(数据源数据输入输出),
Ds2(数据源数据输入输出)
//非常容易忘记在这里添加
}
}
问题:鉴于
枚举数据源
,是否可以编写一个宏来自动生成枚举数据源
,并避免每次添加新数据源
时手动修改枚举数据源
?枚举解析似乎是一个复杂的问题,因此移动是合理的数据源在宏本身中的实际声明。以下是我的想法:
#[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
}
}
#[宏使用]
国防部来源{
宏规则!数据源{
($name:ident,$type:tt)=>{
枚举$name{
Ds1($type),
Ds2($type)
}
}
}
//...
}
修改一些其他的{
结构数据源数据输入输出{
输入:::输入,
输出:::输出
}
数据源!(测试、数据源数据输入输出);
fn测试_fn(){
让ds1io:DataSourceDataInputOutput=DataSourceDataInputOutput{
投入:1,
产出:2
};
让test=DataSourceIO::Ds1(ds1io);//正常工作
}
}