gpt4 book ai didi

rust - 根据结构字段类型创建结构的宏

转载 作者:行者123 更新时间:2023-12-03 11:48:52 24 4
gpt4 key购买 nike

我正在尝试制作一个宏,该宏生成具有新功能实现的结构。新函数需要根据字段的类型调用函数,并将返回值用作字段值。

新的实现应最终像这样工作:

struct foo {
test: i32,
other: String,
}

impl foo {
fn new() -> Self {
foo {
test: get_i32(),
other: get_string(),
}
}
}

这是我目前的代码:
macro_rules! test {
(struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
#[derive(Debug)]
pub struct $name {
$(pub $fname : $ftype),*
}

impl $name {
fn new(mut v: Vec<u8>) -> Self {
$name {
$($fname : ),*
}
}
}
};
}

我尝试过放置match语句,但是它给出了不兼容的武器类型错误。
impl $name {
fn new(mut v: Vec<u8>) -> Self {
$name {
$($fname : match &stringify!($ftype)[..] {
"i32" => get_i32(),
"String" => get_string(),
}),*
}
}
}

谢谢你。

最佳答案

我设法使用了另一个返回任何函数的函数。

macro_rules! test {
(struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
#[derive(Debug)]
pub struct $name {
$(pub $fname : $ftype),*
}

impl $name {
fn new(mut v: Vec<u8>) -> Self {
$name {
$($fname : get_feild::<$ftype>(stringify!($ftype)).downcast_ref::<$ftype>().unwrap().clone()),*
}
}
}
};
}

fn get_feild<T>(t: &str) -> Box<dyn std::any::Any> {
match t {
"i32" => Box::new(get_i32()),
"String" => Box::new(get_string()),
_ => panic!("UNKNOWN TYPE"),
}
}

关于rust - 根据结构字段类型创建结构的宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61714623/

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