| Crates.io | lending-cell |
| lib.rs | lending-cell |
| version | 0.1.1 |
| created_at | 2022-07-09 18:27:55.599896+00 |
| updated_at | 2022-07-14 02:36:00.501244+00 |
| description | Like a cell, but make lifetimes dynamic instead of ownership |
| homepage | |
| repository | https://github.com/njaard/lending-cell |
| max_upload_size | |
| id | 622676 |
| size | 10,087 |
LendingCell is a mutable container that allows you to get an owned reference to the same object. When the owned reference is dropped, ownership returns to the original container.
As opposed to a std::cell::Cell which moves Rust's
ownership rules to runtime, a LendingCell moves Rust's
lifetime rules to runtime.
The value of a LendingCell is present at
construction-time, but you can convert it to a
BorrowedCell<T> by calling LendingCell::to_borrowed.
While that BorrowedCell lives (that is, until it is dropped),
calling LendingCell::try_get will return None. The
BorrowedCell has exclusive access to your type, as though you
have a directly owned instance of the T, and so it is Send
as long as T is Send. At last, when you drop the BorrowedCell,
the T is returned to the LendingCell.
If you drop your LendingCell before dropping the BorrowedCell,
then the T is dropped at the time you drop the BorrowedCell.
The invariants that Rust's memory safety rules enforce, like
the single-mutable reference rule, are therefor partially ensured
at compile time (you can't get two mutable references to the
T), but also partially at runtime (while the BorrowedCell
is active, the LendingCell behaves as though it is an Option
containing None.
let mut lender = LendingCell::new("borrowed");
let borrowed = lender.to_borrowed();
assert!(lender.try_get().is_none()); // `lender` is empty because it was borrowed
assert_eq!(*borrowed, "borrowed"); // it's certain that `borrowed` is valid while in scope
drop(borrowed); // dropping `borrowed` returns its value to `lender`
assert!(lender.try_get().is_some());