从我开始学习 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(使用前将#替换为@)