T: 'a 结构体中的推导

Minimum Rust version: nightly

一个注释形式为 T:'a,其中 T 可以是一个类型或另一个生命周期,被称为 “outlives” 要求。 注意 “outlives” 也意味着 'a:'a

2018版在编写程序时帮助您保持流程的一种方法是,不需要在 struct 定义中明确注释这些 T:'a 的要求。 相反,这些要求将从定义中的字段推断出来。

考虑下面这个 struct 定义,在 Rust 2015 中:

  1. // Rust 2015
  2. struct Ref<'a, T: 'a> {
  3. field: &'a T
  4. }
  5. // or written with a `where` clause:
  6. struct WhereRef<'a, T> where T: 'a {
  7. data: &'a T
  8. }
  9. // with nested references:
  10. struct RefRef<'a, 'b: 'a, T: 'b> {
  11. field: &'a &'b T,
  12. }
  13. // using an associated type:
  14. struct ItemRef<'a, T: Iterator>
  15. where
  16. T::Item: 'a
  17. {
  18. field: &'a T::Item
  19. }

在 Rust 2018 中, 这种需求是可以被推导的,你可以这样写:

  1. // Rust 2018
  2. struct Ref<'a, T> {
  3. field: &'a T
  4. }
  5. struct WhereRef<'a, T> {
  6. data: &'a T
  7. }
  8. struct RefRef<'a, 'b, T> {
  9. field: &'a &'b T,
  10. }
  11. struct ItemRef<'a, T: Iterator> {
  12. field: &'a T::Item
  13. }

如果您希望在某些情况下更明确,那仍然是可能的。

更多的细节

更多信息,查阅 the tracking issuethe RFC.