LoginSignup
8
5

More than 1 year has passed since last update.

Rustにおけるシングルトンの実装方法

Last updated at Posted at 2023-03-29

オブジェクト指向プログラミングにおいて、シングルトンはクラスのインスタンス化を1つのインスタンスに制限し、そのインスタンスへのグローバルなアクセスポイントを提供するデザインパターンです。Rustでは、staticキーワードとunsafeブロックを使用してシングルトンを実装することができます。

以下のコードを見てみましょう。

use derive_getters::Getters;
use std::env;

#[derive(Debug, Getters)]
pub struct SingletonInteger {
    value: i64,
}

pub fn singleton_integer() -> &'static SingletonInteger {
    unsafe {
        if SINGLETON_INTEGER.is_none() {
            SINGLETON_INTEGER = Some(SingletonInteger { value: 123 });
        }
        SINGLETON_INTEGER.as_ref().unwrap()
    }
}

static mut SINGLETON_INTEGER: Option<SingletonInteger> = None;

このコードは、単一のi64型のvalueフィールドを含むSingletonInteger構造体を宣言しています。Gettersマクロを使用して、valueフィールドに対するgetterを生成します。

singleton_integer()関数は、静的SingletonIntegerインスタンスへの参照を返します。unsafeブロックが使用されているのは、静的可変変数を変更しているためです。 SINGLETON_INTEGER変数がNoneの場合、新しいSingletonIntegerインスタンスを作成し、valueフィールドを123に設定します。

なぜvalueフィールドがプライベートなのか?

Rustでは、フィールドをプライベートにしてアクセサを提供することが推奨されています。これは、フィールドのアクセス方法を制御し、不変条件を強制することができるためです。

この場合、SingletonIntegerインスタンスを1度しかインスタンス化しないようにし、valueフィールドが設定された後に変更されないようにしたいため、valueフィールドをプライベートにしています。

Gettersマクロは、プライベートなvalueフィールドにgetterを生成するために使用されます。これにより、直接valueフィールドを公開することなく、読み取り専用でvalueフィールドにアクセスすることができます。

クライアントコードでシングルトンを使用する方法

クライアントコードでsingleton_integer()関数を使用するには、モジュールをインポートし、関数を呼び出します。

use my_module::singleton_integer;

fn main() {
    let value = singleton_integer().value();
    println!("The value is {}", value);
}

この例では、singleton_integer()関数を呼び出してSingletonIntegerインスタンスへの参照を取得し、get_value()メソッドを呼び出してvalueフィールドの値を取得しています。

まとめ

この記事では、staticキーワードとunsafeブロックを使用してRustでシングルトンを実装する方法を学びました。また、フィールドをプライベートにし、アクセサを提供することが推奨される理由、そしてプライベートフィールドにgetterを生成するためのGettersマクロを使用する方法についても学びました。

シングルトンを実装することで、クラスのインスタンスを1つだけ作成し、そのインスタンスへのグローバルアクセスを提供することができます。これは、設定やデータベース接続など、アプリケーション全体で1つの状態を維持したい場合などに役立ちます。

8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5