1 个不稳定版本
0.1.0 | 2023 年 9 月 15 日 |
---|
#1170 在 并发
每月 154 次下载
28KB
690 行
为 Rust 提供线程安全且可变的程序状态。
示例
初始化状态
任何可能使用的应用状态都必须首先初始化。 注意: AppState
不能作为 MutAppState
使用,反之亦然。这意味着 AppState
和 MutAppState
必须分别初始化并使用独立值,即使它们是同一类型。
use app_state::{AppState, MutAppState, AppStateTrait};
struct MyState {
counter: u32,
}
fn main() {
// Initialize the app state
AppState::init(MyState { counter: 0 });
// Initialize the mutable app state
MutAppState::init(MyState { counter: 0 });
}
使用 derive
为了避免样板代码,可以为任何结构体派生 InitAppState
和 InitMutAppState
特性。这些特性分别提供 init_app_state
和 init_mut_app_state
方法,可以用来更轻松地初始化状态。
use app_state::{AppState, MutAppState, AppStateTrait, InitAppState, InitMutAppState};
#[derive(Default, InitAppState, InitMutAppState)]
struct MyState {
counter: u32,
}
fn main() {
MyState::default().init_app_state();
MyState::default().init_mut_app_state();
}
只读状态
应用状态内部使用 Arc
以允许线程安全访问。
use app_state::{AppState, AppStateTrait, stateful};
struct MyState {
counter: u32,
}
#[stateful]
fn func(state: AppState<MyState>) {
println!("Counter: {}", state.counter);
}
可变状态
可变状态内部使用 Mutex
来确保线程安全。这意味着在读取或写入状态时,必须锁定互斥锁。这可以通过调用 get_mut()
或使用 MutAppStateLock
类型来完成。
use app_state::{MutAppState, AppStateTrait, stateful};
struct MyState {
counter: u32,
}
#[stateful]
fn func(state: MutAppState<MyState>) {
let mut state = state.get_mut();
state.counter += 1;
}
可变状态(已锁定)
为了修改状态,您必须首先锁定它。这可以通过调用 get_mut()
或使用 MutAppStateLock
类型来完成。
use app_state::{MutAppState, MutAppStateLock, AppStateTrait, stateful};
struct MyState {
counter: u32,
}
#[stateful]
fn func(mut state: MutAppStateLock<MyState>) {
state.counter += 1;
}
手动获取状态
您还可以通过调用 AppState::get()
或 MutAppState::get()
来手动获取状态。
use app_state::{AppState, MutAppState, AppStateTrait};
struct MyState {
counter: u32,
}
fn main() {
let state = AppState::<MyState>::get();
let mut_state = MutAppState::<MyState>::get();
}
依赖
~0.5–1MB
~22K SLoC