Rust宏中bool的检查值
我想创建一个宏来检查所提供bool的值,并基于该值返回一个字符串。我试过这个:Rust宏中bool的检查值,rust,macros,rust-macros,Rust,Macros,Rust Macros,我想创建一个宏来检查所提供bool的值,并基于该值返回一个字符串。我试过这个: macro\u规则!dbg_bool{ () => {}; ($val:expr$(,)?)=>{ 匹配$val{ //如果$val为true,则返回一个绿色字符串 $($val==true)=>{ “这是真的” } //如果$val为false,则返回一个红色字符串 $($val==false)=>{ “这是假的” } } }; ($($val:expr),+$(,)?)=>{ ($(dbg_bool!($val)
macro\u规则!dbg_bool{
() => {};
($val:expr$(,)?)=>{
匹配$val{
//如果$val为true,则返回一个绿色字符串
$($val==true)=>{
“这是真的”
}
//如果$val为false,则返回一个红色字符串
$($val==false)=>{
“这是假的”
}
}
};
($($val:expr),+$(,)?)=>{
($(dbg_bool!($val)),+,)
};
}
但这给了我一个错误:
error: expected one of: `*`, `+`, or `?`
--> src/macros.rs:28:32
|
28 | $($val == true) => {
| ________________________________^
29 | | "it was true".green()
30 | | }
| |_____________^
在我的宏中使用相等运算符比较
$var
的正确方法是什么?只要匹配$val
,就没有特殊语法
macro\u规则!dbg_bool{
() => {};
($val:expr$(,)?)=>{
匹配$val{
真=>{
“这是真的”
}
假=>{
“这是假的”
}
}
};
($($val:expr),+$(,)?)=>{
($(dbg_bool!($val)),+,)
};
}
只要匹配$val
,就没有特殊的语法
macro\u规则!dbg_bool{
() => {};
($val:expr$(,)?)=>{
匹配$val{
真=>{
“这是真的”
}
假=>{
“这是假的”
}
}
};
($($val:expr),+$(,)?)=>{
($(dbg_bool!($val)),+,)
};
}
宏中的匹配
语法不变:
macro_rules! dbg_bool{
() => {};
($val:expr $(,)?) => {
match $val {
//if $val is true return a green string
true => {
"it was true".green()
}
//if $val is false return a red string
false => {
"it was false".red()
}
}
};
($($val:expr),+ $(,)?) => {
($(dbg_bool!($val)),+,)
};
}
另一方面,当您使用宏时,您假设赋予您的
绿色
和蓝色
的特征在范围内。对于健壮性,您可以像::colored::Colorize::green(“它是真的”)
那样显式地调用它,或者将匹配项
包装在一个块中,以便添加use::Colorize代码>(假设您正在使用板条箱)。请参见上的这两个选项。宏中的匹配语法不会更改:
macro_rules! dbg_bool{
() => {};
($val:expr $(,)?) => {
match $val {
//if $val is true return a green string
true => {
"it was true".green()
}
//if $val is false return a red string
false => {
"it was false".red()
}
}
};
($($val:expr),+ $(,)?) => {
($(dbg_bool!($val)),+,)
};
}
另一方面,当您使用宏时,您假设赋予您的绿色
和蓝色
的特征在范围内。对于健壮性,您可以像::colored::Colorize::green(“它是真的”)
那样显式地调用它,或者将匹配项
包装在一个块中,以便添加use::Colorize代码>(假设您正在使用板条箱)。查看上的这两个选项。匹配臂周围的$()
是多余的,但是为什么要匹配$val
,然后再执行另一个$val==true
和$val==false
检查?是否需要宏?这难道不能用一个正常的函数来完成吗?@kmdreko可以,但是我喜欢用宏来进行所有的调试。匹配臂周围的$()
是多余的,但是为什么你要匹配$val
,然后再做一个额外的$val==true
和$val==false
检查?是否需要宏?这不能用普通函数来完成吗?@kmdreko可以,但我喜欢用宏来进行所有调试