Rust Empty Type
(Jin Qing’s Column, Sep., 2024)
Crate void defines an empty type enum Void {}
.
Empty type is an enum with no variants. Empty type can not be instantiated.
See: https://doc.rust-lang.org/nomicon/exotic-sizes.html
Void
is used in statically impossible cases (type-level unreachability).
For instance, a return type of Result<T, Void>
indicates that it always returns Ok
.
Trait void::ResultVoidErrExt
can be used to unwrap the result, statically indicating the unreachability.
impl<T> ResultVoidExt<T> for Result<T, Void> {
/// Get the value out of an always-ok Result.
///
/// Never panics, since it is statically known to be Ok.
#[inline]
fn void_unwrap(self) -> T {
match self {
Ok(val) => val,
Err(e) => unreachable(e)
}
}
}
rust-libp2p\swarm\src\dummy.rs uses Void
to indicate that FromBehaviour
event is impossible.
impl crate::handler::ConnectionHandler for ConnectionHandler {
type FromBehaviour = Void;
...
fn on_behaviour_event(&mut self, event: Self::FromBehaviour) {
void::unreachable(event)
}
...
}