Skip to content

Interior mutability, write-once and borrowable as plain &T

License

Notifications You must be signed in to change notification settings

kamadak/mutate_once-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Interior mutability, write-once and borrowable as plain `&T`
------------------------------------------------------------

   This library provides interior mutability that can be borrowed
   as plain immutable references `&T` in exchange for the write-once,
   read-many restriction.

   Unlike `std::cell::Cell` or `std::cell::RefCell`, a plain immutable
   reference `&T` can be taken from `MutOnce<T>`.  Once an immutable
   reference is taken, the value can never be mutated (even after all
   references are dropped).

   The use cases include caching getter and delayed evaluation.

Usage
-----

   Run "cargo doc" in the source directory to generate the API reference.
   It is also available online at <https://docs.rs/mutate_once>.

   An example follows:

      struct Container {
          expensive: MutOnce<String>,
      }
      impl Container {
          fn expensive(&self) -> &str {
              if !self.expensive.is_fixed() {
                  let mut ref_mut = self.expensive.get_mut();
                  *ref_mut += "expensive";
                  // Drop `ref_mut` before calling `get_ref`.
              }
              // A plain reference can be returned to the caller
              // unlike `Cell` or `RefCell`.
              self.expensive.get_ref()
          }
      }
      let container = Container { expensive: MutOnce::new(String::new()) };
      assert_eq!(container.expensive(), "expensive");

About

Interior mutability, write-once and borrowable as plain &T

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages