pub enum Variance {
Covariant,
Invariant,
Contravariant,
}
Expand description
Variance
Variants§
Implementations§
source§impl Variance
impl Variance
sourcepub fn xform(self, other: Variance) -> Variance
pub fn xform(self, other: Variance) -> Variance
a.xform(b)
combines the variance of a context with the
variance of a type with the following meaning. If we are in a
context with variance a
, and we encounter a type argument in
a position with variance b
, then a.xform(b)
is the new
variance with which the argument appears.
Example 1:
*mut Vec<i32>
Here, the “ambient” variance starts as covariant. *mut T
is
invariant with respect to T
, so the variance in which the
Vec<i32>
appears is Covariant.xform(Invariant)
, which
yields Invariant
. Now, the type Vec<T>
is covariant with
respect to its type argument T
, and hence the variance of
the i32
here is Invariant.xform(Covariant)
, which results
(again) in Invariant
.
Example 2:
fn(*const Vec<i32>, *mut Vec<i32)
The ambient variance is covariant. A fn
type is
contravariant with respect to its parameters, so the variance
within which both pointer types appear is
Covariant.xform(Contravariant)
, or Contravariant
. *const T
is covariant with respect to T
, so the variance within
which the first Vec<i32>
appears is
Contravariant.xform(Covariant)
or Contravariant
. The same
is true for its i32
argument. In the *mut T
case, the
variance of Vec<i32>
is Contravariant.xform(Invariant)
,
and hence the outermost type is Invariant
with respect to
Vec<i32>
(and its i32
argument).
Source: Figure 1 of “Taming the Wildcards: Combining Definition- and Use-Site Variance” published in PLDI’11. (Doc from rustc)
Trait Implementations§
source§impl PartialEq for Variance
impl PartialEq for Variance
impl Copy for Variance
impl Eq for Variance
impl StructuralPartialEq for Variance
Auto Trait Implementations§
impl Freeze for Variance
impl RefUnwindSafe for Variance
impl Send for Variance
impl Sync for Variance
impl Unpin for Variance
impl UnwindSafe for Variance
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: Copy,
impl<T> CloneToUninit for Twhere
T: Copy,
source§unsafe fn clone_to_uninit(&self, dst: *mut T)
unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
source§default unsafe fn clone_to_uninit(&self, dst: *mut T)
default unsafe fn clone_to_uninit(&self, dst: *mut T)
clone_to_uninit
)