Rust宏的关键字参数

Rust宏的关键字参数,rust,macros,Rust,Macros,假设我有这样一个结构: structfoo{ a:i32, b:i32, } 是否可以使用macro\u规则定义宏,这样我就可以像这样创建Foos 让f1=make\u foo!( a=5, ); 让f2=make_foo!( b=2, a=6, ); 让f3=make_foo!( b=9, ); 让f4=make_foo!(); 我希望所有参数都是可选的-我将在宏中或通过defaulttrait指定一个默认值-理想情况下,顺序并不重要,尽管这只是“很好拥有”。棘手的部分将是找出存在哪些字段

假设我有这样一个结构:

structfoo{
a:i32,
b:i32,
}
是否可以使用
macro\u规则定义宏
,这样我就可以像这样创建
Foo
s

让f1=make\u foo!(
a=5,
);
让f2=make_foo!(
b=2,
a=6,
);
让f3=make_foo!(
b=9,
);
让f4=make_foo!();

我希望所有参数都是可选的-我将在宏中或通过
default
trait指定一个默认值-理想情况下,顺序并不重要,尽管这只是“很好拥有”。

棘手的部分将是找出存在哪些字段。也许可以编写一个proc宏来实现这一点,但我推荐另一种方法

Rust中惯用的方法是使用Builder模式。有一个板条箱可以自动为您的


这个字段也存在:

棘手的部分是找出存在哪些字段。也许可以编写一个proc宏来实现这一点,但我推荐另一种方法

Rust中惯用的方法是使用Builder模式。有一个板条箱可以自动为您的


这个也存在:

这可以使用字段记录更新语法执行:

#[derive(Debug, Default)]
struct Foo {
    a: i32,
    b: i32,
}

macro_rules! make_foo {
    ($($field:ident = $value:expr),* $(,)?) => {
        Foo {
            $(
                $field: $value,
            )*
            ..Default::default()
        }
    }
}

可以使用字段记录更新语法执行此操作:

#[derive(Debug, Default)]
struct Foo {
    a: i32,
    b: i32,
}

macro_rules! make_foo {
    ($($field:ident = $value:expr),* $(,)?) => {
        Foo {
            $(
                $field: $value,
            )*
            ..Default::default()
        }
    }
}

要跟进Cerberus的回答,如果您想对传递的值进行逐字段处理,可以添加一个模块,其中的函数与字段名匹配,如下所示:

#[派生(调试,默认)]
pub struct Foo{
a:i32,
b:绳子,
}
莫德福乌塞特酒店{
pub fn a(x:i32)->i32{x}
pub fn b(x:&str)->字符串{x.to_owned()}
}
宏规则!美孚{
($($field:ident=$value:expr),*$(,)?)=>{
福{
$(
$field:foo_setters::$field($value),
)*
…默认值::默认值()
}
}
}
pub fn foo()->foo{
做你的(
a=5,
b=“hi”//不需要.to_string()!
)
}

要跟进Cerberus的回答,如果您想对传递的值进行逐字段处理,可以添加一个模块,其中的函数与字段名匹配,如下所示:

#[派生(调试,默认)]
pub struct Foo{
a:i32,
b:绳子,
}
莫德福乌塞特酒店{
pub fn a(x:i32)->i32{x}
pub fn b(x:&str)->字符串{x.to_owned()}
}
宏规则!美孚{
($($field:ident=$value:expr),*$(,)?)=>{
福{
$(
$field:foo_setters::$field($value),
)*
…默认值::默认值()
}
}
}
pub fn foo()->foo{
做你的(
a=5,
b=“hi”//不需要.to_string()!
)
}

是的,这可能是我的备份选项。我将不得不写很多这篇文章,所以我试着写一些尽可能简洁的东西。是的,这可能是我的备份选项。我将不得不写很多这篇文章,虽然我试图用一些尽可能简洁的东西。太棒了!有没有办法为不同的领域做不同的事情?例如,如果我想让一个字段执行
$value.to_string()
?我不知道,对不起。我找到了一种方法-查看我的答案。如果没有你的话,我也做不到,谢谢!太神了有没有办法为不同的领域做不同的事情?例如,如果我想让一个字段执行
$value.to_string()
?我不知道,对不起。我找到了一种方法-查看我的答案。如果没有你的话,我也做不到,谢谢!