gpt4 book ai didi

rust - 静态可变数据的惯用替代方法是什么?

转载 作者:行者123 更新时间:2023-11-29 07:59:00 25 4
gpt4 key购买 nike

我正在使用 Iron 框架创建一个简单的端点。我有端点需要访问的有状态、可变数据。

这里有一些代码表明了我的意图:

extern crate iron;
extern crate mount;

use iron::{Iron, Request, Response, IronResult};
use iron::status;
use mount::Mount;

static mut s_counter: Option<Counter> = None;

struct Counter {
pub count: u8
}

impl Counter {
pub fn new() -> Counter {
Counter {
count: 0
}
}

pub fn inc(&mut self) {
self.count += 1;
}
}

fn main() {
unsafe { s_counter = Some(Counter::new()); }
let mut mount = Mount::new();
mount.mount("/api/inc", inc);
println!("Server running on http://localhost:3000");
Iron::new(mount).http("127.0.0.1:3000").unwrap();
}

fn inc(req: &mut Request) -> IronResult<Response> {
let mut counter: Counter;
unsafe {
counter = match s_counter {
Some(counter) => counter,
None => { panic!("counter not initialized"); }
};
}
counter.inc();
let resp = format!("{}", counter.count);
Ok(Response::with((status::Ok, resp)))
}

此代码无法编译:

error: cannot move out of static item

我希望有更好的方法来做到这一点,不涉及任何不安全的代码或static mut。我的问题是,实现这一目标的惯用方法是什么?

最佳答案

我强烈建议您完整阅读 The Rust Programming Language ,尤其是 chapter on concurrency . Rust 社区付出了很多努力来制作高质量的文档来帮助人们摆脱困境。

在这种情况下,我可能只是让 Counter 构造一个 Iron Handler .然后,我会在结构中使用一个原子变量来保存计数而不需要可变性:

extern crate iron;
extern crate mount;

use std::sync::atomic::{AtomicUsize, Ordering};

use iron::{Iron, Request, Response, IronResult};
use iron::status;
use mount::Mount;

struct Counter {
count: AtomicUsize,
}

impl Counter {
pub fn new() -> Counter {
Counter {
count: AtomicUsize::new(0),
}
}
}

fn main() {
let mut mount = Mount::new();
mount.mount("/api/inc", Counter::new());
println!("Server running on http://localhost:3000");
Iron::new(mount).http("127.0.0.1:3000").unwrap();
}

impl iron::Handler for Counter {
fn handle(&self, _: &mut Request) -> IronResult<Response> {
let old_count = self.count.fetch_add(1, Ordering::SeqCst);

let resp = format!("{}", old_count);

Ok(Response::with((status::Ok, resp)))
}
}

关于rust - 静态可变数据的惯用替代方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32685853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com