在 Rust "macro_rules" 宏中的调用站点使用本地绑定
Use local bindings at call site in Rust "macro_rules" macros
考虑以下片段:
macro_rules! quick_hello {
($to_print:expr) => {
{
let h = "hello";
println!("{}", $to_print)
}
}
}
fn main() {
quick_hello!(h);
}
如果我编译它,我得到:
error[E0425]: cannot find value `h` in this scope
--> src/main.rs:12:18
|
12 | quick_hello!(h);
| ^ not found in this scope
但是 main
中的 quick_hello
调用不应该扩展为包含 let h = "hello"
语句的块,从而允许我将它用作“hello”的快捷方式网站?
我可能知道这样做是为了保持宏卫生,但如果我需要上述行为怎么办?有没有办法“关闭”卫生来实现这一点?
处理 quick_hello
调用 rustc
正在查找 $to_print:expr
的 有效 表达式。但是 h
在该上下文中不是有效表达式,因此 rustc
不会继续执行宏实现并打印错误。
正如上面的人所指出的,不清楚你想让这个宏做什么。但是,这会编译并打印 hello:
macro_rules! quick_hello {
(h) => {
let h = "hello";
println!("{}", h)
};
($to_print:expr) => {
{
println!("{}", $to_print)
}
}
}
fn main() {
quick_hello!(h);
}
考虑以下片段:
macro_rules! quick_hello {
($to_print:expr) => {
{
let h = "hello";
println!("{}", $to_print)
}
}
}
fn main() {
quick_hello!(h);
}
如果我编译它,我得到:
error[E0425]: cannot find value `h` in this scope
--> src/main.rs:12:18
|
12 | quick_hello!(h);
| ^ not found in this scope
但是 main
中的 quick_hello
调用不应该扩展为包含 let h = "hello"
语句的块,从而允许我将它用作“hello”的快捷方式网站?
我可能知道这样做是为了保持宏卫生,但如果我需要上述行为怎么办?有没有办法“关闭”卫生来实现这一点?
处理 quick_hello
调用 rustc
正在查找 $to_print:expr
的 有效 表达式。但是 h
在该上下文中不是有效表达式,因此 rustc
不会继续执行宏实现并打印错误。
正如上面的人所指出的,不清楚你想让这个宏做什么。但是,这会编译并打印 hello:
macro_rules! quick_hello {
(h) => {
let h = "hello";
println!("{}", h)
};
($to_print:expr) => {
{
println!("{}", $to_print)
}
}
}
fn main() {
quick_hello!(h);
}