Ian*_*anS 7 macros rust macro-rules
我创建了一个 Rust 宏,它扩展为函数声明。
macro_rules! build_fn
{
($name:tt) => {
pub fn $name(&self) -> Result<i32, Box<dyn Error>>
{
// <implementation>
Ok(0)
}
};
}
Run Code Online (Sandbox Code Playgroud)
是否可以扩展它以便宏可以采用可变参数?
例如
($name:tt, /*$variable_args ? */) => {
pub fn $name(&self, /*$variable_args ? */) -> Result<i32, Box<dyn Error>>
{
// ...
Ok(0)
}
};
}
Run Code Online (Sandbox Code Playgroud)
小智 5
确实,这是可能的。您需要将参数扩展为$field: $ty
:
use std::error::Error;
macro_rules! build_fn
{
($name:tt, $($v:ident: $t:ty),*) => {
pub fn $name(&self, $($v: $t),*)
{
let args = [$($v,)*];
println!("Args = {:?}", args);
}
};
}
struct MyStruct {}
impl MyStruct {
build_fn!(test_single_arg, x: i32);
build_fn!(test_multi_arg, x: i32, y: i32);
}
fn main() -> Result<(), Box<dyn Error>> {
let my_struct = MyStruct {};
my_struct.test_single_arg(10);
my_struct.test_multi_arg(1, 2);
Ok(())
}
Run Code Online (Sandbox Code Playgroud)