#[repr(u8)]pub enum VariancePosition {
Covariant = 0,
Contravariant = 1,
Invariant = 2,
}Expand description
Position of a type dependency in variance computation.
This determines how the dependency’s variance is transformed before combining:
Covariant: Use the dependency’s variance as-isContravariant: Flip the dependency’s variance before combiningInvariant: Converts non-bivariant variance to invariant
From the Rust Reference:
&'a Tis covariant with respect to T → T is in covariant positionfn(T) -> Uis contravariant with respect to T → T is in contravariant positionfn(T) -> Uis covariant with respect to U → U is in covariant position&'a mut Tis invariant with respect to T → T is in invariant position
Variants§
Covariant = 0
Dependency’s variance is used as-is.
Examples: T in &T, T in Box<T>, return type in fn() -> T
Contravariant = 1
Dependency’s variance is flipped before combining.
Examples: argument T in fn(T)
Invariant = 2
The type parameter is in invariant position (per Rustonomicon xform rules).
From the Rustonomicon,
&'a mut T is covariant with respect to 'a and invariant with respect to T. When we
compute combined variance, any lifetimes inside T are in invariant position.
Transformation (xform):
- Bivariant → Bivariant (T has no lifetimes, nothing to make invariant)
- Covariant/Contravariant/Invariant → Invariant (lifetimes in T become invariant)
This means &'a mut i32 is Covariant (only 'a, which is covariant),
while &'a mut &'b U is Invariant ('b is in invariant position).
Examples: T in &mut T, T in Cell<T>, T in UnsafeCell<T>
Trait Implementations§
Source§impl Clone for VariancePosition
impl Clone for VariancePosition
Source§fn clone(&self) -> VariancePosition
fn clone(&self) -> VariancePosition
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more