Rust 有没有一种方法可以让函数返回的值比上次的值高一个?

g14*_*g14 4 function rust

所以我有这个用户结构,我希望第一个用户的 id 为 1,第二个用户的 id 为 2,第三个用户的 id 为 3,等等。所以这段代码的预期输出应该是: Jack :1,吉尔:2
有谁知道如何做到这一点,或者在 Rust 中这是不可能的吗?

struct User {
    name: String,
    id: u32,
}
impl User {
    fn new_user(name: String) -> User{
        User{
            name,
            id,
        }
    }
}
fn main() {
    let user1 = User::new_user("Jack".to_string());
    let user2 = User::new_user("Jill".to_string());
    println!("{}: {}, {}: {}", user1.name, user1.id, user2.name, user2.id);
}
Run Code Online (Sandbox Code Playgroud)

Dog*_*ert 7

实现此目的的一种方法是创建一个全局(静态)AtomicU32计数器来存储下一个id要使用的计数器,并在每次调用时递增它User::new_user。请注意,达到最大 u32 值后 ids 将回绕至 0。

您可以在文档中阅读有关原子类型的更多信息。

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

struct User {
    name: String,
    id: u32,
}

static NEXT_ID: AtomicU32 = AtomicU32::new(1);

impl User {
    fn new_user(name: String) -> User {
        User {
            name,
            // we increment the value by 1 and fetch the old value
            // see also: https://doc.rust-lang.org/std/sync/atomic/enum.Ordering.html
            id: NEXT_ID.fetch_add(1, Ordering::Relaxed),
        }
    }
}

fn main() {
    let user1 = User::new_user("Jack".to_string());
    let user2 = User::new_user("Jill".to_string());
    println!("{}: {}, {}: {}", user1.name, user1.id, user2.name, user2.id);
}
Run Code Online (Sandbox Code Playgroud)

输出:

Jack: 1, Jill: 2
Run Code Online (Sandbox Code Playgroud)

操场