< 返回版块

xznsoft 发表于 2018-03-19 16:38

Tags:macro

我期望调用一个宏:比如

get_fn!(foo);

这个宏get_fn会创建一个get_foo函数:

fn get_foo() -> i8 {
    100
}

我试着这样写报错

#[macro_export]
macro_rules! get_fn {
    ($name:ident) => {
        fn get_$name() -> i8 {
            100
        }
    };
}

最关键问题的是怎么把foo改为get_foo

这种需求的宏应该怎么写???

评论区

写评论
作者 xznsoft 2018-03-21 12:19

谢谢大家回复

查了很多资料目前好像实现起来挺困难的

https://github.com/SkylerLipthay/interpolate_idents 这个crate通过编译器插件的方式实现了类似的功能

LiuTongshuo 2018-03-19 21:41

concat_idents 只能生成已经定义的identifier,不能用于定义新identifier

@wspsxing #![feature(concat_idents)]

fn foobar() -> u32 { 23 }

let f = concat_idents!(foo, bar); println!("{}", f());

// fn concat_idents!(new, fun, name) { } // not usable in this way!

LiuTongshuo 2018-03-19 17:49

可以用 proc_macro

wspsxing 2018-03-19 16:55
#![feature(concat_idents)]

fn foobar() -> u32 { 23 }

let f = concat_idents!(foo, bar);
println!("{}", f());

// fn concat_idents!(new, fun, name) { } // not usable in this way!
1 共 4 条评论, 1 页