我可以定义一个将扩展为函数调用的宏吗?
Can I define a macro which will expand into a function call?
我已经(天真地)试过了,但它没有在屏幕上打印任何内容:
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);
}
是,也不是。
首先,concat!
生成一个字符串,因此您的代码基本上与您编写的代码相同:
fn main() {
"foobool(true)";
"fooi32(1)";
}
这是一个空操作。
要生成 Rust 代码,宏根本不需要涉及字符串:
macro_rules! foo {
($suffix:tt, $arg:expr) => {
$suffix($arg);
};
}
您可以称其为 foo!(foo_bool, true);
。
但是如果你想从 foo
和 bool
构造名称 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);
}
我已经(天真地)试过了,但它没有在屏幕上打印任何内容:
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);
}
是,也不是。
首先,concat!
生成一个字符串,因此您的代码基本上与您编写的代码相同:
fn main() {
"foobool(true)";
"fooi32(1)";
}
这是一个空操作。
要生成 Rust 代码,宏根本不需要涉及字符串:
macro_rules! foo {
($suffix:tt, $arg:expr) => {
$suffix($arg);
};
}
您可以称其为 foo!(foo_bool, true);
。
但是如果你想从 foo
和 bool
构造名称 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);
}