#[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 moreSource§impl Debug for VariancePosition
impl Debug for VariancePosition
Source§impl Hash for VariancePosition
impl Hash for VariancePosition
Source§impl PartialEq for VariancePosition
impl PartialEq for VariancePosition
impl Copy for VariancePosition
impl Eq for VariancePosition
impl StructuralPartialEq for VariancePosition
Auto Trait Implementations§
impl Freeze for VariancePosition
impl RefUnwindSafe for VariancePosition
impl Send for VariancePosition
impl Sync for VariancePosition
impl Unpin for VariancePosition
impl UnsafeUnpin for VariancePosition
impl UnwindSafe for VariancePosition
Blanket Implementations§
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.