如何在 Rust 中将空白/空参数传递给宏?

ide*_*n42 5 macros rust

在某些情况下,您可能希望向宏传递一个参数,该参数要么是一些文本,要么什么都没有(空白,就好像什么也没写一样)。

鉴于这个起点:

macro_rules! testme {
    ($var:ident, $code:block) => {
        for i in 0..10 {
            let $var = i;
            { $code }
            if $var > 5 {
                println!("over 5");
            }
        }
    }
}

fn main() {
    testme!(myvar, {
        println!("{}", myvar);
    });

}
Run Code Online (Sandbox Code Playgroud)

我们可能希望选择var可变,假设宏体比上面的示例更大,最好不要复制整个宏。

macro_rules! testme {
    (private $var:ident, $code:block, $var_qual:tt) => {
        for i in 0..10 {
            // imagine this is a lot more code :)
            let $var_qual $var = i;
            { $code }
            if $var > 5 {
                println!("over 5");
            }
        }
    };
    (mut $var:ident, $code:block) => {
        testme!(private $var, $code, mut)
    };
/*
    ($var:ident, $code:block) => {
        testme!(private $var, $code, )
        //                          ^ how to pass in a blank argument?
    };
*/
}

fn main() {
    testme!(mut myvar_mut, {
        myvar_mut += 10;
        println!("{}", myvar_mut);
    });
/*
    testme!(myvar_immutable, {
        println!("{}", myvar_immutable);
    });
*/
}
Run Code Online (Sandbox Code Playgroud)

据我所知,无法传递空参数,请取消注释/**/以查看错误。


是否可以将空参数传递给宏以使这样的示例起作用?

ide*_*n42 4

据我所知,不可能传递空白/空参数。

然而,可以传入本地定义的宏,该宏可以选择添加前缀。

工作示例:

macro_rules! testme {
    (private $var:ident, $code:block, $var_qual_macro:ident) => {
        for i in 0..10 {
            // imagine this is a lot more code :)
            let $var_qual_macro!($var) = i;
            { $code }
            if $var > 5 {
                println!("over 5");
            }
        }
    };
    (mut $var:ident, $code:block) => {
        macro_rules! var_qualifier { ($v:ident) => { mut $v } }
        testme!(private $var, $code, var_qualifier)
    };
    ($var:ident, $code:block) => {
        macro_rules! var_qualifier { ($v:ident) => { $v } }
        testme!(private $var, $code, var_qualifier)
    };
}

fn main() {
    testme!(mut myvar_mut, {
        myvar_mut += 10;
        println!("{}", myvar_mut);
    });
    testme!(myvar_immutable, {
        println!("{}", myvar_immutable);
    });
}
Run Code Online (Sandbox Code Playgroud)

嵌套这样的宏时要小心,宏的名称(var_qualifier在本例中)与不同宏中使用的名称不同,因为该名称将被默默隐藏。