如何在Rust中为函数添加状态

问题描述 投票:0回答:2

Rust与州有匿名关闭。我可以用命名函数做同样的事情吗?

(无效的伪代码)

fn counting_function()->i32 {
  let mut static counter = 0;
  counter = counter + 1;
  return counter.clone();
}

我知道我可以使用结构和函数/特征来做到这一点。我知道迭代器是正确的方法。但是除了使用特征和迭代器的结构外,我可以在不将任何负担(初始化结构)传递给调用者的情况下执行此操作吗?

rust closures
2个回答
2
投票

这是使用原子的线程安全变体:

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
}

但它实际上是我要说的代码味道。


-2
投票

你的伪代码几乎可以正常工作。要使用static mut变量,您需要将代码的访问和修改部分标记为unsafe,因为这些操作不是线程安全的。

fn counting_function() -> u32 {
    static mut counter: u32 = 0;
    let retval = unsafe { counter };
    unsafe {
        counter += 1;
    }
    retval
}
© www.soinside.com 2019 - 2024. All rights reserved.