#self-reference #pin #no-std

no-std self-reference

A Self-Reference Helper

13 releases

0.2.1 Sep 22, 2022
0.2.0 Sep 22, 2022
0.1.10 Sep 22, 2022
0.1.5 Aug 29, 2022

#419 in Rust patterns

39 downloads per month
Used in async-http-body

Custom license

182 lines


A Self-Refernece Helper (Inspired From Selfie)

this crate provides safe access to its self-reference. the main idea is not initializing references when object not pinned(which is not safe and makes many self-referenial crate more complex) providing only pinned reference makes lot more easier to design self-referential object. on self-reference crate. you only can initialize reference object that has 'static lifetime means always safe.

Initializing Reference Object

The major difference from other self-referential crate is initializing referential object. you only can initialize reference object that has 'static lifetime

let mut reference: SelfReference<String, Ref<str>> = SelfReference::new(String::new(), || {
    // you can't get reference of object while initialization.
    // only possible cases are reference that has `'static` lifetime.

// this is totally SAFE. this lowers `'static` lifetime into some other lifetime.

Reset Mechanism

The only way to initialize reference object is using reset method. remember!! you can use reset method when SelfReference object is pinned.

let mut reference: SelfReference<String, Ref<str>> = SelfReference::new("self-reference".to_string(), || "");

// You can reset object to set referencial object to hold object itself.
reference.reset_unpin(|s| &s[..4]);
println!("{}", reference.get_ref()); // prints "self"


~15K SLoC