pub struct Lifetime {
pub hir_id: HirId,
pub ident: Ident,
pub kind: LifetimeKind,
pub source: LifetimeSource,
pub syntax: LifetimeSyntax,
}
Expand description
A lifetime. The valid field combinations are non-obvious and not all
combinations are possible. The following example shows some of
them. See also the comments on LifetimeKind
and LifetimeSource
.
#[repr(C)]
struct S<'a>(&'a u32); // res=Param, name='a, source=Reference, syntax=Named
unsafe extern "C" {
fn f1(s: S); // res=Param, name='_, source=Path, syntax=Hidden
fn f2(s: S<'_>); // res=Param, name='_, source=Path, syntax=Anonymous
fn f3<'a>(s: S<'a>); // res=Param, name='a, source=Path, syntax=Named
}
struct St<'a> { x: &'a u32 } // res=Param, name='a, source=Reference, syntax=Named
fn f() {
_ = St { x: &0 }; // res=Infer, name='_, source=Path, syntax=Hidden
_ = St::<'_> { x: &0 }; // res=Infer, name='_, source=Path, syntax=Anonymous
}
struct Name<'a>(&'a str); // res=Param, name='a, source=Reference, syntax=Named
const A: Name = Name("a"); // res=Static, name='_, source=Path, syntax=Hidden
const B: &str = ""; // res=Static, name='_, source=Reference, syntax=Hidden
static C: &'_ str = ""; // res=Static, name='_, source=Reference, syntax=Anonymous
static D: &'static str = ""; // res=Static, name='static, source=Reference, syntax=Named
trait Tr {}
fn tr(_: Box<dyn Tr>) {} // res=ImplicitObjectLifetimeDefault, name='_, source=Other, syntax=Hidden
fn capture_outlives<'a>() ->
impl FnOnce() + 'a // res=Param, ident='a, source=OutlivesBound, syntax=Named
{
|| {}
}
fn capture_precise<'a>() ->
impl FnOnce() + use<'a> // res=Param, ident='a, source=PreciseCapturing, syntax=Named
{
|| {}
}
// (commented out because these cases trigger errors)
// struct S1<'a>(&'a str); // res=Param, name='a, source=Reference, syntax=Named
// struct S2(S1); // res=Error, name='_, source=Path, syntax=Hidden
// struct S3(S1<'_>); // res=Error, name='_, source=Path, syntax=Anonymous
// struct S4(S1<'a>); // res=Error, name='a, source=Path, syntax=Named
Some combinations that cannot occur are LifetimeSyntax::Hidden
with
LifetimeSource::OutlivesBound
or LifetimeSource::PreciseCapturing
— there’s no way to “elide” these lifetimes.
Fields§
§hir_id: HirId
§ident: Ident
Either a named lifetime definition (e.g. 'a
, 'static
) or an
anonymous lifetime ('_
, either explicitly written, or inserted for
things like &type
).
kind: LifetimeKind
Semantics of this lifetime.
source: LifetimeSource
The context in which the lifetime occurred. See Lifetime::suggestion
for example use.
syntax: LifetimeSyntax
The syntax that the user used to declare this lifetime. See
Lifetime::suggestion
for example use.
Implementations§
Source§impl Lifetime
impl Lifetime
pub fn new( hir_id: HirId, ident: Ident, kind: LifetimeKind, source: LifetimeSource, syntax: LifetimeSyntax, ) -> Lifetime
pub fn is_elided(&self) -> bool
pub fn is_anonymous(&self) -> bool
pub fn is_syntactically_anonymous(&self) -> bool
pub fn is_static(&self) -> bool
pub fn suggestion(&self, new_lifetime: &str) -> (Span, String)
Trait Implementations§
Source§impl<__CTX> HashStable<__CTX> for Lifetimewhere
__CTX: HashStableContext,
impl<__CTX> HashStable<__CTX> for Lifetimewhere
__CTX: HashStableContext,
fn hash_stable(&self, __hcx: &mut __CTX, __hasher: &mut StableHasher)
impl Copy for Lifetime
Auto Trait Implementations§
impl DynSend for Lifetime
impl DynSync for Lifetime
impl Freeze for Lifetime
impl RefUnwindSafe for Lifetime
impl Send for Lifetime
impl Sync for Lifetime
impl Unpin for Lifetime
impl UnwindSafe for Lifetime
Blanket Implementations§
Source§impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
impl<'tcx, T> ArenaAllocatable<'tcx, IsCopy> for Twhere
T: Copy,
fn allocate_on(self, arena: &'tcx Arena<'tcx>) -> &'tcx mut T
fn allocate_from_iter( arena: &'tcx Arena<'tcx>, iter: impl IntoIterator<Item = T>, ) -> &'tcx mut [T]
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> WithSubscriber for T
impl<T> WithSubscriber for T
Source§fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
Source§fn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Layout§
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.
Size: 28 bytes