所以我有这个用户结构,我希望第一个用户的 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)
实现此目的的一种方法是创建一个全局(静态)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)