#state #mutable #thread-safe #applications #counter #u32 #initialization

app-state

为 Rust 提供线程安全且可变的程序状态

1 个不稳定版本

0.1.0 2023 年 9 月 15 日

#1170并发

Download history 6/week @ 2024-03-11 20/week @ 2024-04-01 36/week @ 2024-04-22 26/week @ 2024-04-29 72/week @ 2024-05-06 115/week @ 2024-05-20 109/week @ 2024-06-10 28/week @ 2024-06-17 17/week @ 2024-06-24

每月 154 次下载

自定义许可证

28KB
690

为 Rust 提供线程安全且可变的程序状态。

示例

初始化状态

任何可能使用的应用状态都必须首先初始化。 注意: AppState 不能作为 MutAppState 使用,反之亦然。这意味着 AppStateMutAppState 必须分别初始化并使用独立值,即使它们是同一类型。

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

为了避免样板代码,可以为任何结构体派生 InitAppStateInitMutAppState 特性。这些特性分别提供 init_app_stateinit_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