Expand description
§::unsafe-binders
Stable rust polyfill of unsafe<'lt> … binders.
Conceptually, unsafe binders are the way to express the 'unsafe/'never/'expired/'dangling lifetime
used in certain unsafe constructs (e.g., self-referential data), in a way less unsoundness-prone
way as using 'static instead would be:
-
by virtue of requiring
unsafeto access the data, -
and it not performing liveness or (lack-of-)aliasing assertions (courtesy of
::maybe-dangling, like'static-infected types may accidentally do.
§Example
use ::unsafe_binders::{DropMarker, Unsafe};
pub struct SelfReferential {
full_name: String,
first_name: Unsafe![DropMarker::NoDropGlue, <'this> &'this str],
// using lifetime-elision shorthand syntax:
last_name: Unsafe![DropMarker::NoDropGlue, &str],
}
impl SelfReferential {
pub fn new(full_name: String) -> Option<Self> {
let (first_name, last_name) = full_name.split_once(" ")?;
// erase the `&'full_name` lifetime:
let first_name: Unsafe![_, &str] = Unsafe::wrap_binder_copy(first_name);
// shorthand syntax
let last_name: Unsafe![&str] = Unsafe::wrap_binder_copy(last_name);
Some(Self {
full_name,
first_name,
last_name,
})
}
pub fn first_name<'r>(&'r self) -> &'r str {
unsafe {
self.first_name.unwrap_binder_ref::<'_, 'r>()
}
}
pub fn last_name<'r>(&'r self) -> &'r str {
unsafe {
self.last_name.unwrap_binder_ref::<'_, 'r>()
}
}
}Modules§
- Drop
Marker - Type-level
enum { MayDrop, NoDropGlue }. - prelude
- The crate’s prelude.
Macros§
- Unsafe
- Convenience macro to name/express an
unsafe<'lt> …type:
Structs§
- Unsafe
- Stable rust polyfill of
unsafe<'lt> …binders, with a fixed arity of 1.
Traits§
- ForLifetime
- The main trait of the crate. The one expressing
: <'_>-genericity.