Skip to content

Latest commit

 

History

History
40 lines (30 loc) · 1.65 KB

README.md

File metadata and controls

40 lines (30 loc) · 1.65 KB

Self-Reference

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.

Safety Note

This crate is tested under miri. Please crate an issue if you find any soundness holes.

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.
    ""
});
pin_mut!(reference);

// this is totally SAFE. this lowers `'static` lifetime into some other lifetime.
reference.get_ref();

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(), || "");
pin_mut!(reference);

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