#cell #immutability #reference #container #safe #value

no-std mucell

一种可以在安全的情况下通过不可变引用修改值的cell

26个版本

使用旧的Rust 2015

0.3.5 2016年1月22日
0.3.4 2015年7月20日
0.2.0 2015年5月18日
0.1.17 2015年3月26日
0.1.2 2014年11月29日

#1993数据结构

每月下载量27次

MIT/Apache

22KB
255

mucell 0.3.5

Build Status

一种可以在安全的情况下通过不可变引用修改值的cell。

RefCell 的比较

RefCell 实现了完全的运行时检查,有 try_borrowtry_borrow_mutborrowborrow_mut,都接受 &self 并在所有地方使用自定义引用类型。

MuCell(出于同情和“非ascii标识符不受完全支持”的事实,我没有将其命名为 ΜCell,而是将其命名为 µcell)在真正的Rust借用检查上做了更多的工作,以实现更有效且没有panic可能性的结果。

然而,它的目的与 RefCell 不同;它专门设计用于那些只需要一个不可变引用,但能够安全地获取一个可变引用可以提高效率的情况。例如,当缓存计算结果有益,但你实际上并不需要这么做的时候。

所有这些的目的都是为了提供一个对 T 的访问器,如果它能够拥有 &mut self,那么它将更加高效,但它并不严格要求这样做。因此,它通常会与 std::borrow::Cow 一起使用,例如 Cow<str>Cow<[T]>,如果你能够修改值,将产生 Borrowed,如果不能,将产生相同数据的 Owned

示例

此示例涵盖了库的大部分功能

# use mucell::MuCell;
let mut cell = MuCell::new(vec![1i, 2, 3]);

// You can borrow from the cell mutably at no cost.
cell.borrow_mut().push(4);

// You can borrow immutably, too, and it’s very cheap.
// (Rust’s standard borrow checking prevents you from doing
// this while there’s a mutable reference taken out.)
assert_eq!(&cell.borrow()[], &[1, 2, 3, 4][]);

// So long as there are no active borrows,
// try_mutate can be used to mutate the value.
assert!(cell.try_mutate(|x| x.push(5)));
assert_eq!(&cell.borrow()[], &[1, 2, 3, 4, 5][]);

// But when there is an immutable borrow active,
// try_mutate says no.
let b = cell.borrow();
assert!(!cell.try_mutate(|_| unreachable!()));
drop(b);

// We can have many immutable borrows at a time, too.
{
    let a = cell.borrow();
    let b = cell.borrow();
    let c = cell.borrow();
    assert_eq!(&*a as *const _, &*b as *const _);
}

// Once they’re all cleared, try_mutate is happy again.
assert!(cell.try_mutate(|x| x.push(6)));
assert_eq!(&cell.borrow()[], &[1, 2, 3, 4, 5, 6][]);

请查看存储库中的示例,以获取一些稍微更实用(尽管仍然通常是人为制造的)的示例。

用法

使用Cargo。 http://crates.io/crates/mucell

这个包可以通过启用no_std Cargo功能与#![no_std]一起使用。

通过启用const_fn Cargo功能,MuCell::new可以在nightly版本中变为const fn而不是普通的函数。

作者

Chris Morgan (chris-morgan)是这个库的主要作者和维护者。

许可证

此库的分布条款与Rust类似:MIT许可证和Apache许可证(版本2.0)的双重许可。

有关详细信息,请参阅LICENSE-APACHE、LICENSE-MIT和COPYRIGHT。

无运行时依赖

功能