gpt4 book ai didi

rust 宏 : Calling function dependent on expression

转载 作者:行者123 更新时间:2023-11-29 08:26:32 24 4
gpt4 key购买 nike

我有三个不同的函数,我想根据宏参数调用其中一个。这个参数应该被预处理,这就是为什么我认为我需要把它写成 expr。但是,我似乎无法找到一种方法来区分宏中 expr 的不同情况。这是我的代码:

fn func_100(){
println!("Func 100!");
}
fn func_200(){
println!("Func 200!");
}
fn func_300(){
println!("Func 300!");
}

macro_rules! generate_func_call {
(100) => {
func_100();
};
(200) => {
func_200();
};
(300) => {
func_300();
}
}

macro_rules! generate_func_call_wrapper {
($func: ident, $number: expr) => {
fn $func(){
println!("{:?}", $number / 100);
generate_func_call!($number);
}
};
}

generate_func_call_wrapper!(f1,100);
generate_func_call_wrapper!(f2,200);
generate_func_call_wrapper!(f3,300);

fn main(){
f1();
}

生成以下编译时错误:

    generate_func_call!($number);
^^^^^^^ no rules expected this token in macro call

我该如何修复这个程序,以便根据 $number 表达式调用不同的函数?

最佳答案

您可以通过调用 cargo +nightly rustc --profile=check -- -Zunstable-options --pretty=expanded 或使用 cargo-expand 查看宏扩展

fn f1() {
{
::std::io::_print(::std::fmt::Arguments::new_v1(
&["", "\n"],
&match (&(100 / 100),) {
(arg0,) => [::std::fmt::ArgumentV1::new(arg0, ::std::fmt::Debug::fmt)],
},
));
};
();
}

可以看到最后的();本来应该是func_100()

这是因为 generate_func_call 中没有 ($number: expr) 类型的标记规则,即没有匹配扩展的规则。这是因为 $number 没有像您在函数中期望的那样被替换为 100。该宏只是基于 fragment types 创建了更多的 Rust 代码。它接收,它不会尝试评估任何东西。

将代码更改为:

macro_rules! generate_func_call {
($number: expr) => {
match $number {
100 => func_100(),
200 => func_200(),
300 => func_300(),
_ => (),
}
};
}

最后 (); 更改为:

match 300 {
100 => func_100(),
200 => func_200(),
300 => func_300(),
_ => (),
};

您不必担心额外的跳转语句等,因为 300 是编译时常量,它已得到优化。它只是变成了 func_300()

关于 rust 宏 : Calling function dependent on expression,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55802372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com