コンストラクタ

説明

Rustには言語構造としてのコンストラクタはありません。代わりに、オブジェクトを作成するために関連関数であるnewを使用することが慣習となっています:

#![allow(unused)]
fn main() {
/// 秒単位の時間。
///
/// # 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トレイトを使用したデフォルトコンストラクタをサポートしています:

#![allow(unused)]
fn main() {
/// 秒単位の時間。
///
/// # Example
///
/// ```
/// 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は、Secondのように全てのフィールドの型がDefaultを実装している場合、派生させることもできます:

#![allow(unused)]
fn main() {
/// 秒単位の時間。
///
/// # Example
///
/// ```
/// 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関数です。

参照