コンストラクタ

説明

Rustには、言語の構成要素としてコンストラクタというものを持っていません。 代わりに [関連関数][associated function] の new を使ってオブジェクトを生成するのが一般的です:

#![allow(unused)]
fn main() {
/// Time in seconds.
///
/// # Example
///
/// ```
/// let s = Second::new(42);
/// assert_eq!(42, s.value());
/// ```
pub struct Second {
    value: u64,
}

impl Second {
    // Constructs a new instance of [`Second`].
    // Note this is an associated function - no self.
    pub fn new(value: u64) -> Self {
        Self { value }
    }

    /// Returns the value in seconds.
    pub fn value(&self) -> u64 {
        self.value
    }
}
}

デフォルトコンストラクタ

Rust は [Default][std-default] トレイトとして、デフォルトコンストラクタをサポートしています:

#![allow(unused)]
fn main() {
/// 秒単位の時間。
///
/// # 例
///
/// ```
/// let s = Second::default();
/// assert_eq!(0, s.value());
/// ```
pub struct Second {
    value: u64,
}

impl Second {
    /// Returns the value in seconds.
    pub fn value(&self) -> u64 {
        self.value
    }
}

impl Default for Second {
    fn default() -> Self {
        Self { value: 0 }
    }
}
}

すべてのフィールドのすべての型が Default を実装していれば、 Default も派生させることができます。下記の Second で行っているように:

#![allow(unused)]
fn main() {
/// 秒単位の時間。
///
/// # 例
///
/// ```
/// let s = Second::default();
/// assert_eq!(0, s.value());
/// ```
#[derive(Default)]
pub struct Second {
    value: u64,
}

impl Second {
    /// Returns the value in seconds.
    pub fn value(&self) -> u64 {
        self.value
    }
}
}

注意: 型が Default と 空の new コンストラクタの両方を実装することは一般的であり、期待されています。new は Rust におけるコンストラクタの慣習であり、ユーザはその存在を期待しています。基本的なコンストラクタが引数を取らないことが合理的であれば、たとえ機能的には default と同じであるとしても、そのように実装すべきです。

ヒント: Default を実装または派生させることの利点は、あなたの型が Default の実装が必要な場所で使用できるようになることです。特に顕著なのは、 [標準ライブラリの *or_default 関数][std-or-default] です。

See also

Last change: 2024-07-09, commit: 317c88e