根据结构字段的类型创建结构的宏
Macro that makes struct based on struct field's types
我正在尝试创建一个宏来生成具有新函数实现的结构。新建函数需要根据字段类型调用函数,使用return值作为字段值
新的实现应该像这样工作:
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 : ),*
}
}
}
};
}
我试过输入匹配语句,但它给出了不兼容的武器类型错误。
impl $name {
fn new(mut v: Vec<u8>) -> Self {
$name {
$($fname : match &stringify!($ftype)[..] {
"i32" => get_i32(),
"String" => get_string(),
}),*
}
}
}
谢谢。
我设法使用了另一个 returns any 函数来让它工作。
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"),
}
}
我正在尝试创建一个宏来生成具有新函数实现的结构。新建函数需要根据字段类型调用函数,使用return值作为字段值
新的实现应该像这样工作:
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 : ),*
}
}
}
};
}
我试过输入匹配语句,但它给出了不兼容的武器类型错误。
impl $name {
fn new(mut v: Vec<u8>) -> Self {
$name {
$($fname : match &stringify!($ftype)[..] {
"i32" => get_i32(),
"String" => get_string(),
}),*
}
}
}
谢谢。
我设法使用了另一个 returns any 函数来让它工作。
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"),
}
}