PR

Rust でシングルトンの実装方法

1. はじめに

Rust でシングルトンを実装する方法を調べてみました。
once_cell というライブラリを使うと、シングルトンを簡単に実装できるようです。

2. 以下、ソースコード

singleton.rs

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

#[derive(Debug)]
struct Singleton {
    data: i32,
}

impl Singleton {
    fn new() -> Self {
        Self { data: 0 }
    }

    fn set(&mut self, data: i32) {
        self.data = data;
    }

    fn get(&self) -> i32 {
        self.data
    }

}

static INSTANCE: OnceCell<Mutex<Singleton>> = OnceCell::new();

pub fn new() {
    let instance = Mutex::new(Singleton::new());
    INSTANCE.set(instance).unwrap();
}

pub fn set(data: i32) {
    let instance = INSTANCE.get().unwrap();
    let mut singleton = instance.lock().unwrap();
    singleton.set(data);
}

pub fn get() -> i32 {
    let instance = INSTANCE.get().unwrap();
    let singleton = instance.lock().unwrap();
    singleton.get()
}

INSTANCE.set(instance).unwrap(); で、シングルトンのインスタンスを生成しています。
INSTANCE.get().unwrap(); で、シングルトンのインスタンスを取得しています。
instance.lock().unwrap(); で、インスタンスから構造体を取得しデータを操作しています。

main.rs

mod singleton;

fn main() {
    singleton::new();
    println!("Singleton value: {}", singleton::get());
    singleton::set(42);
    println!("Singleton value: {}", singleton::get());
    singleton::set(123);
    println!("Singleton value: {}", singleton::get());
}

シングルトンを使わない場合だと、singleton::new() で構造体を返値で受け取り、その後の処理でその構造体を使いまわす必要があります。
シングルトンを使うことで、返値を受け取る必要がなくモジュール内で使いまわすことができます。

3. まとめ

Rust でシングルトンを実装する方法を調べてみました。
モジュール内に処理を閉じ込めることができるのでコードがスッキリします。

今回の記事も、Github Copilot が8割くらい書いてくれました。

A. 参考サイト

once_cell - Rust
RustでSingletonを実現する方法
【祝安定化】once_cellについて

B. 参考書籍

コメント