<'a, 'b: 'a> 是否意味着生命周期 'b 必须比生命周期 'a 长?
Does <'a, 'b: 'a> mean that the lifetime 'b must outlive the lifetime 'a?
我想实现一个类似于标准库定义的调试 builders 的构建器。它们使用如下结构定义:
struct DebugFoo<'a, 'b: 'a> {
fmt: &'a mut std::fmt::Formatter<'b>
}
因为我不明白形式 <'a, 'b: 'a>
的意思,也无法在 Rust 书籍或 Rust 参考资料中找到它(至少关于生命周期),我只是试图删除我不不明白会发生什么:
struct DebugFoo<'a, 'b> {
fmt: &'a mut std::fmt::Formatter<'b>
}
编译它我得到这个错误:
in type `&'a mut core::fmt::Formatter<'b>`, reference has a longer
lifetime than the data it references
还有这条笔记:
the pointer is valid for the lifetime 'a as defined on the struct at 1:0
but the referenced data is only valid for the lifetime 'b as defined on
the struct at 1:0
这对我来说很有意义:'a
和 'b
是不同的生命周期,所以,为了安全起见,Rust(借用检查器?)假设 'a
会长寿'b
,并抛出错误。
现在我可以猜到<'a, 'b: 'a>
意味着生命周期'b
一定比生命周期'a
长。我猜对了吗?或者还有更多?我怎样才能找到它的文档?
是的,你大体上是正确的。
绑定 <...: 'a>
意味着 ...
(类型或另一个生命周期)需要能够比 'a
长寿。例如。 'b: 'a
表示“'b
必须至少与 'a
一样长”(但严格来说,它们可以相同)。
冒号读作"outlives",所以
'long: 'short
读作“'long
比 'short
长”。
至于关于该主题的官方文档,到目前为止,我唯一看到它的地方是 RFC on lifetime bounds。
我想实现一个类似于标准库定义的调试 builders 的构建器。它们使用如下结构定义:
struct DebugFoo<'a, 'b: 'a> {
fmt: &'a mut std::fmt::Formatter<'b>
}
因为我不明白形式 <'a, 'b: 'a>
的意思,也无法在 Rust 书籍或 Rust 参考资料中找到它(至少关于生命周期),我只是试图删除我不不明白会发生什么:
struct DebugFoo<'a, 'b> {
fmt: &'a mut std::fmt::Formatter<'b>
}
编译它我得到这个错误:
in type `&'a mut core::fmt::Formatter<'b>`, reference has a longer
lifetime than the data it references
还有这条笔记:
the pointer is valid for the lifetime 'a as defined on the struct at 1:0
but the referenced data is only valid for the lifetime 'b as defined on
the struct at 1:0
这对我来说很有意义:'a
和 'b
是不同的生命周期,所以,为了安全起见,Rust(借用检查器?)假设 'a
会长寿'b
,并抛出错误。
现在我可以猜到<'a, 'b: 'a>
意味着生命周期'b
一定比生命周期'a
长。我猜对了吗?或者还有更多?我怎样才能找到它的文档?
是的,你大体上是正确的。
绑定 <...: 'a>
意味着 ...
(类型或另一个生命周期)需要能够比 'a
长寿。例如。 'b: 'a
表示“'b
必须至少与 'a
一样长”(但严格来说,它们可以相同)。
冒号读作"outlives",所以
'long: 'short
读作“'long
比 'short
长”。
至于关于该主题的官方文档,到目前为止,我唯一看到它的地方是 RFC on lifetime bounds。