我想使用宏来生成函数体,但要这样做,他们需要访问局部范围内的变量:
macro_rules! generate_func {
($name:ident) => {
fn $name(param: i32) {
generate_body!()
}
};
}
macro_rules! generate_body {
() => {
println!("{}", ¶m);
}
}
generate_func!(foo);
Run Code Online (Sandbox Code Playgroud)
error[E0425]: cannot find value `param` in this scope
--> src/lib.rs:11:25
|
11 | println!("{}", ¶m);
| ^^^^^ not found in this scope
...
15 | generate_func!(foo);
| -------------------- in this macro invocation
|
= note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
Run Code Online (Sandbox Code Playgroud)
非常令人沮丧的是,这不起作用,因为我可以运行cargo-expand并看到生成的代码是有效的:
fn foo(param: i32) {
{
::std::io::_print(::core::fmt::Arguments::new_v1(&["", "\n"],
&match (&¶m,) {
(arg0,) =>
[::core::fmt::ArgumentV1::new(arg0,
::core::fmt::Display::fmt)],
}));
}
}
Run Code Online (Sandbox Code Playgroud)
(由于 ,这有点混乱println!,但您可以在那里看到有效的参考)
我什至可以将扩展复制并粘贴到我的源代码中,编译器会接受它。当然有某种方法可以实现预期的结果吗?
它似乎与以下内容大致相关:
但我不能确定我有完全相同的问题。我的情况似乎更基本。
Rust 宏是卫生的,它可以防止标识符从一个范围泄漏到另一个范围并造成各种混乱。但是您可以通过param从generate_functo传递来解决这个特殊问题generate_body:
macro_rules! generate_func {
($name:ident) => {
fn $name(param: i32) {
generate_body!(param)
}
};
}
macro_rules! generate_body {
($param:ident) => {
println!("{}", &$param);
}
}
generate_func!(foo);
Run Code Online (Sandbox Code Playgroud)
在操场上看到它。
| 归档时间: |
|
| 查看次数: |
651 次 |
| 最近记录: |