Rust 了解锈蚀追踪信息(目标:“宏”和类型
我一直很喜欢通过它的类型系统导航。但当它进入宏时,我发现很难理解。在下面的示例中,为什么可以将Rust 了解锈蚀追踪信息(目标:“宏”和类型,rust,macros,Rust,Macros,我一直很喜欢通过它的类型系统导航。但当它进入宏时,我发现很难理解。在下面的示例中,为什么可以将“target\u name”传递给target,但不分配它,然后传入分配?您如何导航,使下面的内容对您来说是显而易见的?我从开发人员经验和程序员的角度提出了同样多的问题。(我肯定在寻找一个“教人钓鱼”式的答案。) 后一个调用导致: error[E0435]: attempt to use a non-constant value in a constant | 44 | info
“target\u name”
传递给target
,但不分配它,然后传入分配?您如何导航,使下面的内容对您来说是显而易见的?我从开发人员经验和程序员的角度提出了同样多的问题。(我肯定在寻找一个“教人钓鱼”式的答案。)
后一个调用导致:
error[E0435]: attempt to use a non-constant value in a constant
|
44 | info!(target: target_name, "message");
| ^^^^^^^^^^^ non-constant value
即使我切换到
&target\u name.as\u str()
,我认为它应该是常量(不能像String
那样增长),宏仍然会失败,并出现相同的错误。这就是我的心理地图失败的地方。我可以理解,分配时假定的类型是错误的,但是当我重新创建它时,它为什么会失败?这里的解决方案是将常量
与符合预期的类型一起使用,例如:
const target\u name:&str=“target\u name”;
您通常可以查看这些宏的源代码,如下所示:
#[宏导出(本地内部宏)]
宏规则!信息{
(target:$target:expr,$($arg:tt)+)=>(
日志!(目标:$target,$crater::Level::Info,$($arg)+)
);
($($arg:tt)+)=>(
日志!($crate::Level::Info,$($arg)+)
)
}
这只是
日志的包装代码>,所以它不是特别有用,而且日志
只是\uuu private\uAPI\uLog
的一个包装器,它的用处更小。它需要一个静态生命周期吗?您是否尝试过使用常量target\u name:&str=“…”
?是的,可以!因此,这不仅是因为宏强制执行&str
,而且还因为它以某种方式使它成为常量?我可以在宏中的哪个位置阅读以理解此内容?谢谢!是的,我已经了解了如何使用const
,但我真的想要“教鱼”部分,在那里我可以查看宏源代码,了解$target
需要const
,以及它是如何从我看来像字符串文字的内容强制执行的。你还可以说些什么吗?就像许多语言(C++是一个主要的例子)一样,源代码并不总是那么有用。这里的重点通常是性能或正确性,而不是可读性或任何形式的理解。如果没有大量的支持资源,我不相信Rust的内部结构会很有教育意义。您可以随时键入变量,如let x:Y=…
,以避免自动键入。我不认为带引号的字符串会自动变成string
,我总是必须使用string::from(“…”)
来明确它。我会接受这一点,因为似乎没有更好的答案,但“只要继续挖掘宏,直到找到实际类型”
error[E0435]: attempt to use a non-constant value in a constant
|
44 | info!(target: target_name, "message");
| ^^^^^^^^^^^ non-constant value