Struct rustc_middle::ty::DebruijnIndex [−][src]
pub struct DebruijnIndex {
pub(crate) private: u32,
}Expand description
A De Bruijn index is a standard means of representing regions (and perhaps later types) in a higher-ranked setting. In particular, imagine a type like this:
for<'a> fn(for<'b> fn(&'b isize, &'a isize), &'a char) ^ ^ | | | | | | | | | +------------+ 0 | | | | | +----------------------------------+ 1 | | | +----------------------------------------------+ 0
In this type, there are two binders (the outer fn and the inner fn). We need to be able to determine, for any given region, which fn type it is bound by, the inner or the outer one. There are various ways you can do this, but a De Bruijn index is one of the more convenient and has some nice properties. The basic idea is to count the number of binders, inside out. Some examples should help clarify what I mean.
Let’s start with the reference type &'b isize that is the first
argument to the inner function. This region 'b is assigned a De
Bruijn index of 0, meaning “the innermost binder” (in this case, a
fn). The region 'a that appears in the second argument type (&'a isize) would then be assigned a De Bruijn index of 1, meaning “the
second-innermost binder”. (These indices are written on the arrows
in the diagram).
What is interesting is that De Bruijn index attached to a particular
variable will vary depending on where it appears. For example,
the final type &'a char also refers to the region 'a declared on
the outermost fn. But this time, this reference is not nested within
any other binders (i.e., it is not an argument to the inner fn, but
rather the outer one). Therefore, in this case, it is assigned a
De Bruijn index of 0, because the innermost binder in that location
is the outer fn.
Fields
private: u32Auto Trait Implementations
impl RefUnwindSafe for DebruijnIndeximpl Send for DebruijnIndeximpl Sync for DebruijnIndeximpl Unpin for DebruijnIndeximpl UnwindSafe for DebruijnIndexBlanket Implementations
Mutably borrows from an owned value. Read more
impl<Ctxt, T> DepNodeParams<Ctxt> for T where
T: HashStable<<Ctxt as DepContext>::StableHashingContext> + Debug,
Ctxt: DepContext,
impl<Ctxt, T> DepNodeParams<Ctxt> for T where
T: HashStable<<Ctxt as DepContext>::StableHashingContext> + Debug,
Ctxt: DepContext, This method turns the parameters of a DepNodeConstructor into an opaque Fingerprint to be used in DepNode. Not all DepNodeParams support being turned into a Fingerprint (they don’t need to if the corresponding DepNode is anonymous). Read more
This method tries to recover the query key from the given DepNode,
something which is needed when forcing DepNodes during red-green
evaluation. The query system will only call this method if
can_reconstruct_query_key() is true.
It is always valid to return None here, in which case incremental
compilation will treat the query as having changed instead of forcing it. Read more
Layout
Note: Most layout information is completely unstable and may be different between compiler versions and platforms. 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: 4 bytes