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

Macros 如何将空白/空参数传递给Rust中的宏?,macros,rust,Macros,Rust,在某些情况下,您可能希望将一个参数传递给一个宏,该宏要么是一些文本,要么什么都没有(空白,就好像什么都没有写) 鉴于这一起点: macro_rules! testme { ($var:ident, $code:block) => { for i in 0..10 { let $var = i; { $code } if $var > 5 { println!

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

鉴于这一起点:

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);
    });

}
我们可能希望
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);
    });
*/
}
据我所知,无法传入空参数,请取消注释
/**/
注释以查看错误



是否可以将空参数传递给宏以使这样的示例生效?

据我所知,传递空/空参数是不可能的

但是,可以传入一个本地定义的宏,该宏可以选择性地添加前缀

工作示例:

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);
    });
}

在嵌套这样的宏时,请注意宏的名称(
var\u限定符,在本例中为
)与另一个宏中使用的名称不同,因为名称将被隐藏起来。

为什么要这样做?在文本输入的情况下,它可能只是一个空字符串,而不是空字符串。@ljedrz,文本是完全不同的情况,这是一个可选的关键字,因此不可能如此轻松地将其作为参数传递。我正在使用一个宏,它充当迭代器,并使用一个变量名来声明,这可能需要可变或不可变-可以发布到原始代码的链接-但不确定是否需要。不,我现在可以看到它;我想我只是不太习惯依赖宏,这与常规代码是完全不同的问题。