Default トレイト
std::default::Default
トレイトの実装により、型に応じた自明なデフォルト値を提供できる。
std::default::Default
トレイトは以下のような定義となっている。
pub trait Default: Sized { fn default() -> Self; }
例えば、String
は以下のように Default
を実装している。
impl Default for String { fn default() -> String { String::new() } }
以下のようにデフォルト値を取得できる(std::default::Default
は prelude から自動的にインポートされる)。
let s1: String = Default::default(); let s2 = String::default();
Rust の多くの型が Default
トレイトを実装している。
コレクション型はdefault
メソッドで空のコレクションを返す。
タプルの全ての要素が Default
を実装していれば、そのタプルもDefault
を実装していることになり、各要素のデフォルト値を保持したタプルをデフォルト値として取得できる。
ある型T
が Default
を実装していれば、Rc<T>
、Arc<T>
、Box<T>
、Cell<T>
、RefCell<T>
、Cow<T>
、Mutex<T>
、RwLock<T>
も Default
が実装される。
構造体のすべてのフィールドが Default
を実装していれば、#[derive(Default)]
により自動的に Default
を実装させることができる。
#[derive(Default)] struct SomeOptions { foo: i32, bar: f32, } fn main() { let options = SomeOptions::default(); }
デフォルト値は部分的に上書きすることができる。
fn main() { let options = SomeOptions { foo: 42, ..Default::default() }; }
enum のデフォルト値は以下のように #[default]
で設定できる。
#[derive(Default)] enum Kind { #[default] A, B, C, }
これは以下と同等です。
impl Default for Kind { fn default() -> Self { Kind::A } }