コンストラクタ
説明
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関数です。
参照
-
Defaultトレイトの詳細な説明についてはdefaultイディオムを参照してください。 -
複数の設定があるオブジェクトを構築する場合はビルダーパターンを参照してください。
-
Defaultとnewの両方を実装することについてはAPI Guidelines/C-COMMON-TRAITSを参照してください。