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=ExplicitBound
unsafe extern "C" {
fn f1(s: S); // res=Param, name='_, source=Path, syntax=Implicit
fn f2(s: S<'_>); // res=Param, name='_, source=Path, syntax=ExplicitAnonymous
fn f3<'a>(s: S<'a>); // res=Param, name='a, source=Path, syntax=ExplicitBound
}
struct St<'a> { x: &'a u32 } // res=Param, name='a, source=Reference, syntax=ExplicitBound
fn f() {
_ = St { x: &0 }; // res=Infer, name='_, source=Path, syntax=Implicit
_ = St::<'_> { x: &0 }; // res=Infer, name='_, source=Path, syntax=ExplicitAnonymous
}
struct Name<'a>(&'a str); // res=Param, name='a, source=Reference, syntax=ExplicitBound
const A: Name = Name("a"); // res=Static, name='_, source=Path, syntax=Implicit
const B: &str = ""; // res=Static, name='_, source=Reference, syntax=Implicit
static C: &'_ str = ""; // res=Static, name='_, source=Reference, syntax=ExplicitAnonymous
static D: &'static str = ""; // res=Static, name='static, source=Reference, syntax=ExplicitBound
trait Tr {}
fn tr(_: Box<dyn Tr>) {} // res=ImplicitObjectLifetimeDefault, name='_, source=Other, syntax=Implicit
fn capture_outlives<'a>() ->
impl FnOnce() + 'a // res=Param, ident='a, source=OutlivesBound, syntax=ExplicitBound
{
|| {}
}
fn capture_precise<'a>() ->
impl FnOnce() + use<'a> // res=Param, ident='a, source=PreciseCapturing, syntax=ExplicitBound
{
|| {}
}
// (commented out because these cases trigger errors)
// struct S1<'a>(&'a str); // res=Param, name='a, source=Reference, syntax=ExplicitBound
// struct S2(S1); // res=Error, name='_, source=Path, syntax=Implicit
// struct S3(S1<'_>); // res=Error, name='_, source=Path, syntax=ExplicitAnonymous
// struct S4(S1<'a>); // res=Error, name='a, source=Path, syntax=ExplicitBoundSome combinations that cannot occur are LifetimeSyntax::Implicit with
LifetimeSource::OutlivesBound or LifetimeSource::PreciseCapturing
— there’s no way to “elide” these lifetimes.
Fields§
§hir_id: HirId§ident: IdentEither a named lifetime definition (e.g. 'a, 'static) or an
anonymous lifetime ('_, either explicitly written, or inserted for
things like &type).
kind: LifetimeKindSemantics of this lifetime.
source: LifetimeSourceThe context in which the lifetime occurred. See Lifetime::suggestion
for example use.
syntax: LifetimeSyntaxThe 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_implicit(&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