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

2024-03-14

从我开始学习 Rust 的第一天起,我就有这个问题了。我了解到,实施std::fmt::Debug有一个函数签名

fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result.

起初,我只是复制这个签名并将其视为标准样板代码。然而,随着我了解的更多,我意识到<'_>意味着一生的省略。我做了一些研究,根据问题#49469 https://github.com/rust-lang/rust/issues/48469 <'_>可以让返回值根据参数推断其生命周期(这真的很酷)。但我也看到人们使用<'_>广泛地与fmt::Formatter, 如那个标准库文档 https://doc.rust-lang.org/std/fmt/trait.Debug.html and mio https://github.com/tokio-rs/mio/blob/master/src/interest.rs#L111,在这些情况下<'_>不应更改默认的生命周期推断行为。另外,我用下面的代码做了一个快速测试

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);
}

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

提前致谢。


From Rust RFC 2115:参数生命周期 https://github.com/rust-lang/rfcs/blob/master/text/2115-argument-lifetimes.md:

你可以写'_显式地消除生命周期,并且不推荐完全忽略非生命周期参数& types.

从包含的动机来看:

[A] 对于新手和老手来说,困惑的一点是你可以省略类型的生命周期参数:

struct Iter<'a> { ... }

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

正如详细的人体工程学倡议博客文章 https://blog.rust-lang.org/2017/03/02/lang-ergonomics.html,这种生命周期省略被认为是一个错误:它使得很难一眼看出正在发生借用,特别是如果您不熟悉所涉及的类型。 (这&相比之下,众所周知,类型涉及借用。)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Rust 调试特征的实现使用 Formatter<'_> 类型省略 的相关文章

随机推荐