コンストラクタ
説明
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
-
Default
トレイトのより詳細な記述として default idiom。 -
構成が多岐に渡るオブジェクトの構築のための builder pattern。
-
Default
とnew
の両方を実装することについて APIガイドライン/C-COMMON-TRAITS。