T: 'a inference in structs
An annotation in the form of T: 'a
, where T
is either a type or anotherlifetime, is called an "outlives" requirement. Note that "outlives" alsoimplies 'a: 'a
.
One way in which edition 2018 helps you out in maintaining flow when writingprograms is by removing the need to explicitly annotate these T: 'a
outlivesrequirements in struct
definitions. Instead, the requirements will beinferred 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 issueand the RFC.