为什么 Rust 调试特性的实现使用 Formatter<'_> 类型省略

whi*_*run 4 rust

很久以前我就有这个问题,从我开始学习 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)

它编译并运行。那么<'_>这里有一些我不知道的边缘情况的特殊用法吗?

提前致谢。

kmd*_*eko 5

来自Rust RFC 2115:参数生命周期

您可以编写'_显式省略生命周期,并且不推荐完全放弃非&类型的生命周期参数。

从包含的动机来看:

[A] 新手和老手的困惑点是您可以省略类型的生命周期参数:

struct Iter<'a> { ... }

impl SomeType {
    // Iter here implicitly takes the lifetime from &self
    fn iter(&self) -> Iter { ... }
Run Code Online (Sandbox Code Playgroud)

正如人体工程学倡议博客文章中详述的那样,这种终生省略被认为是一个错误:很难一眼看出正在发生借用,尤其是当您不熟悉所涉及的类型时。(&相比之下,这些类型众所周知涉及借用。)

总之,您应该使用fmt::Formatter<'_>.