pub struct OnceImpl<V: 'static, F: Predicate<V>> { /* private fields */ }Expand description
A synchronization primitive which can nominally be written to only once.
This type is a thread-safe [Once], and can be used in statics.
In many simple cases, you can use [LazyLock<T, F>] instead to get the benefits of this type
with less effort: LazyLock<T, F> “looks like” &T because it initializes with F on deref!
Where OnceLock shines is when LazyLock is too simple to support a given case, as LazyLock
doesn’t allow additional inputs to its function after you call [LazyLock::new(|| ...)].
A OnceLock can be thought of as a safe abstraction over uninitialized data that becomes
initialized once written.
§Examples
static MY_ONCE: Once<i32> = Once::new();
let value = MY_ONCE.get();
assert(value.is_some()); // unsatisfied precondition, as MY_ONCE is uninitialized.Implementations§
Source§impl<V, F: Predicate<V>> OnceImpl<V, F>
impl<V, F: Predicate<V>> OnceImpl<V, F>
Sourcepub const exec fn new(Ghost(f): Ghost<F>) -> r : Self
pub const exec fn new(Ghost(f): Ghost<F>) -> r : Self
r.wf(),r.inv() == f,Creates a new uninitialized [Once].
Sourcepub exec fn init(&self, v: V)
pub exec fn init(&self, v: V)
self.inv().inv(v),self.wf(),Initializes the [Once] with the given value v.
Sourcepub exec fn get<'a>(&'a self) -> r : Option<&'a V>
pub exec fn get<'a>(&'a self) -> r : Option<&'a V>
self.wf(),ensuresself.wf(),r matches Some(res) ==> self.inv().inv(*res),Try to get the value stored in the [Once]. A Option::Some
is returned if the cell is initialized; otherwise, Option::None
is returned.