【问题标题】:Can I define a macro which will expand into a function call?我可以定义一个将扩展为函数调用的宏吗?
【发布时间】:2020-03-11 13:17:17
【问题描述】:

我(天真地)试过这个,但它不会在屏幕上打印任何东西:

macro_rules! foo {
    ($suffix:tt, $arg:expr) => {
        concat!("foo", $suffix, "(", $arg, ")");
    };
}

fn foo_i32(x: i32) {
    println!("i32 {}", x);
}

fn foo_bool(x: bool) {
    println!("bool {}", x);
}

fn main() {
    foo!("bool", true);
    foo!("i32", 1);
}

【问题讨论】:

标签: rust macros rust-macros rust-decl-macros


【解决方案1】:

是的,也不是。

首先,concat! 生成一个字符串,所以你的代码基本上和你写的一样:

fn main() {
    "foobool(true)";
    "fooi32(1)";
}

这是一个空操作。

要生成 Rust 代码,宏根本不需要涉及字符串:

macro_rules! foo {
    ($suffix:tt, $arg:expr) => {
        $suffix($arg);
    };
}

您可以将其称为foo!(foo_bool, true);

但是,如果您想从foobool 构造名称foo_bool,则需要使用concat_idents,它目前不稳定并且不太可能很快稳定(因为它会导致一些卫生问题):

#![feature(concat_idents)]

macro_rules! foo {
    ($suffix:tt, $arg:expr) => {
        concat_idents!(foo_, $suffix)($arg);
    };
}

fn foo_i32(x: i32) {
    println!("i32 {}", x);
}

fn foo_bool(x: bool) {
    println!("bool {}", x);
}

fn main() {
    foo!(bool, true);
    foo!(i32, 1);
}
猜你喜欢
  • 1970-01-01
  • 2020-05-29
  • 2011-11-18
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2017-02-01
  • 1970-01-01
相关资源
最近更新 更多