2 个版本
0.1.1 | 2024 年 8 月 13 日 |
---|---|
0.1.0 | 2024 年 8 月 13 日 |
#665 in Rust 模式
每月 227 次下载
10KB
182 行
Super Cell
一个超级(不安全)的,修改了 Cell
类型以使其更方便,因此可能对可变类型引入了未定义的行为。可能存在未定义行为
- 从引用产生的多个可变引用可能导致可能的竞态条件
- 在单独的线程中进行并发修改,没有保证顺序
- ...等等。
这把安全性留给了程序员,但一般来说,在我自己的项目中使用它,我还没有遇到过造成问题的时刻。
使用方法
use super_cell::*;
fn main() {
// Mutable primitive
let result = SuperCell::new(10);
*result.get_mut() = 11;
assert_eq!(*result.get(), 11); // OK
assert_eq!(*result.get_mut(), 11); // OK
// Mutable Complex Struct
let result = SuperCell::new(Test {
x: 0,
list: vec![],
});
let mutable = result.get_mut();
let mut list = vec![];
mutable.x = 100;
for i in 0..100 {
mutable.list.push(i);
list.push(i);
}
assert_eq!(result.get().x, 100); // OK
assert_eq!(result.get().list, list); // OK
assert_eq!(result.get_mut().x, 100); // OK
assert_eq!(result.get_mut().list, list); // OK
// Mutable Parallel/Async
let result = SuperCell::new(10);
thread::scope(|x| {
let reference = result.get_mut();
let handle = x.spawn(|| {
sleep(Duration::from_millis(10));
*reference = 11;
});
assert_eq!(*result.get(), 10); // OK
assert_eq!(*result.get_mut(), 10); // OK
handle.join().expect("Failed to join thread!");
assert_eq!(*result.get(), 11); // OK
assert_eq!(*result.get_mut(), 11); // OK
});
assert_eq!(*result.get(), 11); // OK
assert_eq!(*result.get_mut(), 11); // OK
}
依赖项
~165KB