```
pub enum Variance {
Covariant,
Invariant,
Contravariant,
}
```

## Expand description

Variance

## Variants

`Covariant`

a <: b

`Invariant`

a == b

`Contravariant`

b <: a

## Implementations

source### impl Variance

### impl Variance

source#### pub 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

### impl Copy for Variance

### impl Eq for Variance

### impl StructuralEq for Variance

### impl StructuralPartialEq for Variance

## Auto Trait Implementations

### 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,

const: unstable · source#### fn borrow_mut(&mut self) -> &mut T

#### fn borrow_mut(&mut self) -> &mut T

source### impl<T> Cast for T

### impl<T> Cast for T

source#### fn cast<U>(self, interner: U::Interner) -> Uwhere

Self: CastTo<U>,

U: HasInterner,

#### fn cast<U>(self, interner: U::Interner) -> Uwhere

Self: CastTo<U>,

U: HasInterner,

`U`

using `CastTo`

.