很久以前我就有这个问题,从我开始学习 Rust 的第一天起。我了解到 for 的实现std::fmt::Debug有一个函数签名
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result.
起初我只是复制这个签名并将其视为标准样板代码。然而,随着我学到的更多,我意识到这<'_>意味着终生省略。我做了一些研究,根据问题 #49469 <'_>可以让返回值根据参数推断其生命周期(这真的很酷)。但我也看到人们<'_>广泛使用with fmt::Formatter,例如标准库文档和mio,在这些情况下<'_>不应更改默认的生命周期推理行为。另外,我用下面的代码做了一个快速测试
use std::fmt;
struct Test();
impl fmt::Debug for Test {
fn fmt(&self,fmt:&mut fmt::Formatter) -> fmt::Result {
write!(fmt,"test")?;
Ok(())
}
}
fn main() {
let t = Test();
println!("{:?}",t);
}
Run Code Online (Sandbox Code Playgroud)
它编译并运行。那么<'_>这里有一些我不知道的边缘情况的特殊用法吗?
提前致谢。
您可以编写
'_显式省略生命周期,并且不推荐完全放弃非&类型的生命周期参数。
从包含的动机来看:
[A] 新手和老手的困惑点是您可以省略类型的生命周期参数:
Run Code Online (Sandbox Code Playgroud)struct Iter<'a> { ... } impl SomeType { // Iter here implicitly takes the lifetime from &self fn iter(&self) -> Iter { ... }正如人体工程学倡议博客文章中详述的那样,这种终生省略被认为是一个错误:很难一眼看出正在发生借用,尤其是当您不熟悉所涉及的类型时。(
&相比之下,这些类型众所周知涉及借用。)
总之,您应该使用fmt::Formatter<'_>.