Câu hỏi phỏng vấn Rust
Câu hỏi

How do I create a global ...

Câu trả lời

Creating a global mutable singleton in Rust can be challenging due to Rust's strict ownership and concurrency rules. However, there are several approaches to achieve this, each with its own trade-offs. Here are some common methods:

Using lazy_static! and Mutex

The lazy_static! macro allows for the lazy initialization of static variables, and Mutex can be used to ensure thread-safe access to the singleton.

rust Copy
#[macro_use]
extern crate lazy_static;
use std::sync::Mutex;

lazy_static! {
    static ref SINGLETON: Mutex<MyStruct> = Mutex::new(MyStruct::new());
}

struct MyStruct {
    // fields
}

impl MyStruct {
    fn new() -> Self {
        MyStruct {
            // initialize fields
        }
    }

    fn do_something(&self) {
        // method implementation
    }
}

fn main() {
    let singleton = SINGLETON.lock().unwrap();
    singleton.do_something();
}

In this example, SINGLETON is a global instance of MyStruct wrapped in a Mutex to ensure that only one thread can access it at a time. The lazy_static! macro ensures that the singleton is initialized only once.

Using OnceCell

The OnceCell crate provides a way to initialize a global variable exactly once, which can be useful for creating singletons.

rust Copy
use once_cell::sync::OnceCell;
use std::sync::Mutex;

static SINGLETON: OnceCell<Mutex<MyStruct>> = OnceCell::new();

struct MyStruct {
    // fields
}

impl MyStruct {
    fn new() -> Self {
        MyStruct {
            // initialize fields
        }
    }

    fn do_something(&self) {
        // method implementation
    }
}

fn get_singleton() -> &'static Mutex<MyStruct> {
    SINGLETON.get_or_init(|| Mutex::new(MyStruct::new()))
}

fn main() {
    let singleton = get_singleton().lock().unwrap();
    singleton.do_something();
}

Here, OnceCell ensures that the Mutex<MyStruct> is initialized only once, and get_singleton provides access to the singleton instance.

Using thread_local! for Single-Threaded Contexts

If your application is single-threaded, you can use the thread_local! macro to create a thread-local singleton.

rust Copy
use std::cell::RefCell;

thread_local! {
    static SINGLETON: RefCell<MyStruct> = RefCell::...
senior

senior

Gợi ý câu hỏi phỏng vấn

junior

What are the differences between String and str in Rust?

expert

Explain the use of async / .await in Rust

middle

What is the difference between Copy and Clone in Rust?

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào