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について
コメント