Rust与州有匿名关闭。我可以用命名函数做同样的事情吗?
(无效的伪代码)
fn counting_function()->i32 {
let mut static counter = 0;
counter = counter + 1;
return counter.clone();
}
我知道我可以使用结构和函数/特征来做到这一点。我知道迭代器是正确的方法。但是除了使用特征和迭代器的结构外,我可以在不将任何负担(初始化结构)传递给调用者的情况下执行此操作吗?
这是使用原子的线程安全变体:
use std::sync::atomic::{AtomicUsize, Ordering};
fn counting_function() -> usize {
static COUNTER: AtomicUsize = AtomicUsize::new(0);
let result = COUNTER.fetch_add(1, Ordering::Relaxed);
result
}
但它实际上是我要说的代码味道。
你的伪代码几乎可以正常工作。要使用static mut
变量,您需要将代码的访问和修改部分标记为unsafe
,因为这些操作不是线程安全的。
fn counting_function() -> u32 {
static mut counter: u32 = 0;
let retval = unsafe { counter };
unsafe {
counter += 1;
}
retval
}