我需要一个程序的几个部分,在不同的模块中,有一个唯一的整数.

例如:

pub fn foo() -> u64 {
    unique_integer!()
}

pub fn bar() -> u64 {
    unique_integer!()
}

(foo()永远不应该返回与bar()相同的值,但值本身是无意义的,不需要跨构建保持稳定.foo()的所有调用都必须返回相同的值,对bar()的所有调用都必须返回相同的值.这些值最好是连续的,但不是必需的.)

有没有办法使用宏来实现这一点?

推荐答案

使用静态原子变量作为计数器,可以对once_cell执行类似操作:

use core::sync::atomic::{Ordering, AtomicU64};
use once_cell::sync::Lazy;

static COUNTER: AtomicU64 = AtomicU64::new(0);

fn foo() -> u64 {
    static LOCAL_COUNTER: Lazy<u64> = Lazy::new(|| COUNTER.fetch_add(1, Ordering::Relaxed));
    *LOCAL_COUNTER
}

fn bar() -> u64 {
    static LOCAL_COUNTER: Lazy<u64> = Lazy::new(|| COUNTER.fetch_add(1, Ordering::Relaxed));
    *LOCAL_COUNTER
}

fn main() {
    dbg!(foo()); // 0
    dbg!(foo()); // still 0
    dbg!(bar()); // 1
    dbg!(foo()); // unchanged - 0
    dbg!(bar()); // unchanged - 1
}

Playground

是的,重复的代码可以像往常一样包装在宏中:

macro_rules! unique_integer {
    () => {{
        static LOCAL_COUNTER: Lazy<u64> = Lazy::new(|| COUNTER.fetch_add(1, Ordering::Relaxed));
        *LOCAL_COUNTER
    }}
}

fn foo() -> u64 {
    unique_integer!()
}

fn bar() -> u64 {
    unique_integer!()
}

Rust相关问答推荐

如何在Rust中获得高效的浮点最大值

如何在Rust中获得不可辩驳的'if let'模式警告Mutex锁定?""

是否可以为`T:Copy`执行`T. clone`的测试

如何将元素添加到向量并返回对该元素的引用?

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

在自定义序列化程序中复制serde(With)的行为

除了调用`waker.wake()`之外,我如何才能确保future 将再次被轮询?

如何用Axum/Tower压缩Html内容?

在rust sqlx中使用ilike和push bind

作为1字节位掩码的布尔值 struct

Rust 的多态现象.AsRef与Derf

如何将生存期参数添加到框<>;具有dyn类型别名

通过异常从同步代码中产生yield 是如何工作的?

如何将带有嵌套borrow /NLL 的 Rust 代码提取到函数中

如何基于常量在Rust中跳过一个测试

如何从trait方法返回std :: iter :: Map?

&self 参数在 trait 的功能中是必需的吗?

通用函数中的生命周期扣除和borrow (通用测试需要)

Cargo:如何将整个目录或文件包含在功能标志中?