在Rust中的调用站点使用本地绑定;宏“U规则”;宏

在Rust中的调用站点使用本地绑定;宏“U规则”;宏,rust,macros,hygiene,rust-decl-macros,Rust,Macros,Hygiene,Rust Decl Macros,考虑以下代码段: macro\u规则!快点,你好{ ($to_print:expr)=>{ { 让h=“你好”; println!(“{},$to_print) } } } fn main(){ 快!你好!(h); } 如果我编译它,我会得到: error[E0425]: cannot find value `h` in this scope --> src/main.rs:12:18 | 12 | quick_hello!(h); |

考虑以下代码段:

macro\u规则!快点,你好{
($to_print:expr)=>{
{
让h=“你好”;
println!(“{},$to_print)
}
}
}
fn main(){
快!你好!(h);
}
如果我编译它,我会得到:

error[E0425]: cannot find value `h` in this scope
  --> src/main.rs:12:18
   |
12 |     quick_hello!(h);
   |                  ^ not found in this scope
但是,
quick\u hello
call in
main
是否应该扩展到包含
let h=“hello”
语句的块,从而允许我在调用站点将其用作“hello”的快捷键


我可能知道这样做是为了保持宏的卫生,但是如果我需要上述行为呢?有没有一种方法可以“关闭”卫生来实现这一点?

处理
快速你好
呼叫
rustc
正在查找
$to\u 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);
}

如果在其调用站点上有名为
h
的变量,宏应该怎么做?@Cerberus用它的新值覆盖它(在本例中为“hello”)。我知道这可能不是设计方面的最佳选择,因为它看起来很奇怪(可能会有编译器警告,使其可以忍受?)。尽管如此,在我的用例中它仍然可以节省大量的输入,所以我仍然对此感兴趣。您可以在声明性宏中匹配标记
h
。我想你想要的也是这样,但这是卫生的(只是有点奇怪,语法方面的)。当简单就可以了时,不要触及复杂和棘手的问题。如果这不适用于你的实际用例,考虑问一个关于你的实际问题的问题,这个例子可能过于简单化以至于不能展示你所面临的问题。锈已经很强大了,没有宏,即使有卫生宏也真的很强大——在你决定你需要更多的能量之前,考虑其他的选择。@ Celbules:是的,我想我可能过于简化了我的问题……因为您的方法确实帮助我实现了这里想要的行为,但在解决我的实际问题时太复杂了(在多个地方使用“速记变量”)。我应该编辑这个问题还是终止它,再做一个新的问题?我意识到了这一点,我在想是否有办法实现我想要的行为。
有没有办法“关闭”卫生来实现这一点?
这根本不是卫生问题。在调用
quick\u hello
之前,
quick\u hello::h
变量不存在。要调用宏,必须使用有效的表达式。但是
quick\u你好!(h) )quick\u hello
的任何情况,code>在上下文中都不是有效的表达式。您可以添加另一种情况,其中
quick\u hello
的参数将具有另一种类型。那么它可能会起作用。最后,我还不清楚你想要实现什么。是的,我现在也明白了,我举的例子太简单了,无法表达我想要实现的目标。我将尝试结束这个问题。这实际上是我第一次遇到这种情况,我不确定我应该做什么。。。我想我会接受你的答案(因为它实际上解决了这个问题),并提出一个更具体的问题。