gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:55:22 24 4
gpt4 key购买 nike

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

鉴于此起点:

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_qualifier)与在不同宏中使用的名称不同,因为名称将被隐藏。

关于macros - 如何将空白/空参数传递给 Rust 中的宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41705542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com