Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 了解锈蚀追踪信息(目标:“宏”和类型_Rust_Macros - Fatal编程技术网

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