T: 'a
inference in structs
An annotation in the form of T: 'a
, where T
is either a type or another
lifetime, is called an "outlives" requirement. Note that "outlives" also
implies 'a: 'a
.
One way in which edition 2018 helps you out in maintaining flow when writing
programs is by removing the need to explicitly annotate these T: 'a
outlives
requirements in struct
definitions. Instead, the requirements will be
inferred from the fields present in the definitions.
Consider the following struct
definitions in Rust 2015:
# #![allow(unused_variables)] #fn main() { // Rust 2015 struct Ref<'a, T: 'a> { field: &'a T } // or written with a `where` clause: struct WhereRef<'a, T> where T: 'a { data: &'a T } // with nested references: struct RefRef<'a, 'b: 'a, T: 'b> { field: &'a &'b T, } // using an associated type: struct ItemRef<'a, T: Iterator> where T::Item: 'a { field: &'a T::Item } #}
In Rust 2018, since the requirements are inferred, you can instead write:
// Rust 2018
struct Ref<'a, T> {
field: &'a T
}
struct WhereRef<'a, T> {
data: &'a T
}
struct RefRef<'a, 'b, T> {
field: &'a &'b T,
}
struct ItemRef<'a, T: Iterator> {
field: &'a T::Item
}
If you prefer to be more explicit in some cases, that is still possible.
More details
For more details, see the tracking issue and the RFC.