pub enum CapKind {
Eq,
Ord,
Hash,
HashStable,
Numeric,
}Expand description
One structural property a type either has or does not (§5.4, §5.5).
The five are not independent; the two hash-shaped ones are a pair, see
CapKind::HashStable.
Variants§
Eq
Comparable with == / != (§5.5). Scalars and Unit are; a composite
is iff every component is; functions never are.
Ord
Has a total order — usable with </>, in a heap, or as a sort key
(§5.4 SupportsOrd, ADR-045). The orderable types are exactly the
scalars whose descriptors carry a compare callback.
Hash
Hashable: the runtime can compute a structural hash of the value. This
is CapKind::Eq’s companion — the descriptor’s hash and equals
callbacks are defined together — and on its own it is not enough to
be a key.
HashStable
Hashable and immutable, which is what a Map key or Set element
must be (D4).
A Vec is hashable: the runtime can hash its current contents. It is
not stably hashable, because key.push(2) after table.insert(key, v) moves the entry’s hash without moving the entry, and the value can
no longer be found. Python rejects list/dict/set as keys for
exactly this reason; Rust permits HashMap<Vec<i32>, V> only because
the borrow checker makes mutating a held key impossible, and Praxis has
var mutation and no borrow checker.
The rule is mutability, not container-ness: scalars, Text, tuples,
records and enums are stable structurally — a tuple is a key iff every
component is — and the eight mutable collections are not.
Numeric
Numeric: admits +, -, *, /, unary minus, and the numeric sinks
(sum, product). Int, UInt, Byte and Float are; nothing else
is. % is narrower still and is not this capability.