| Crates.io | unsafe-binders |
| lib.rs | unsafe-binders |
| version | 0.0.1 |
| created_at | 2025-12-08 15:34:24.981975+00 |
| updated_at | 2025-12-08 15:34:24.981975+00 |
| description | Stable rust polyfill of `unsafe<'lt> …` binders |
| homepage | |
| repository | https://github.com/danielhenrymantilla/unsafe-binders.rs |
| max_upload_size | |
| id | 1973827 |
| size | 48,326 |
::unsafe-bindersStable 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 unsafe to access the data,
and it not performing liveness or (lack-of-)aliasing assertions (courtesy of
::maybe-dangling, like 'static-infected types may
accidentally do.
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>()
}
}
}