首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Rust宏生成具有可变参数的函数

使用Rust宏生成具有可变参数的函数
EN

Stack Overflow用户
提问于 2022-01-27 00:55:04
回答 2查看 1.2K关注 0票数 5

我创建了一个Rust宏,它扩展为一个函数声明。

代码语言:javascript
复制
macro_rules! build_fn
{
    ($name:tt) => {

        pub fn $name(&self) -> Result<i32, Box<dyn Error>>
        {
            // <implementation>
            
            Ok(0)
        }
    };
}

是否可以将其展开,以便宏可以接受可变参数?

例如:

代码语言:javascript
复制
($name:tt, /*$variable_args ? */) => {

        pub fn $name(&self, /*$variable_args ? */) -> Result<i32, Box<dyn Error>>
        {
            // ...
            
            Ok(0)
        }
    };
}

游乐场

EN

回答 2

Stack Overflow用户

发布于 2022-02-18 10:08:39

的确,这是可能的。您需要将参数展开为$field: $ty

代码语言:javascript
复制
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(())
}

链接到操场:https://play.rust-lang.org/?version=nightly&mode=debug&edition=2021&gist=d798cc6a744b53af47dd8cf40fc3b115

票数 3
EN

Stack Overflow用户

发布于 2022-08-18 21:42:34

由于@ranfdev的答案目前还没有编译,所以我已经对其进行了修正和简化,并将其扩展到支持多种类型--而且它现在运行在Rust稳定的环境中:

代码语言:javascript
复制
use std::fmt::Write;

macro_rules! build_vararg_fn {
    ($name:tt, $($v:tt: $t:ty),+) => {

        fn $name($($v: $t),+) {
            let mut msg = String::from("args: ");
            $(
                write!(msg, "{:?}, ", $v).unwrap();
            )+
            println!("{}", &msg[..msg.len()-2]);
        }
    }
}

fn main() {
    build_vararg_fn!(test_single_arg, x: i32);
    build_vararg_fn!(test_multi_arg, x: i32, y: i32);
    build_vararg_fn!(test_multi_type, x: i32, y: i32, z: f64);

    test_single_arg(10);
    test_multi_arg(1, 2);
    test_multi_type(1, 2, 3.14159);
}

输出:

代码语言:javascript
复制
args: 10
args: 1, 2
args: 1, 2, 3.14159

玩游戏!上看

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70872059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档