構造体を定義する為に使います。例えば長方形Rectangle
は以下のように定義できます。
struct Rectangle {
width: u32,
height: u32,
}
このwidth
やheight
のような値のことをフィールドと呼びます。
このインスタンスを作る時はこのようにします。
let rect = Rectangle {
width: 100,
height: 50,
}
デバッグ
デフォルトで自分で作成した Struct はprintln!
などで表示させる仕組みが実装されていません。もしそういう仕組みがほしい場合は#[derive(Debug)]
を Struct 定義の上の行に書くことで最低現の Debug 機能を取り込んでくれます。
Rectangle
の定義箇所を以下に変更します。
#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}
これでprintln!
の中で{:?}
を置くことにより表示できるようになりました。
println!(
"{:?}",
Rectangle {
width: 100,
height: 50
}
)
// Rectangle { width: 100, height: 50 }
ちなみに#[derive]
していないとerror[E0277]: \
main::Rectangle` doesn't implement std::fmt::Debug
というエラーになります。
デフォルト値を設定
Trait std::default::Default を実装することで::default
によりデフォルト値でインスタンス化できます。Struct の各プロパティがDefault
を持っているなら単に#[derive(Default)]
とするだけで実装できます。
#[derive(Default, Debug)]
struct SomeOptions {
string: String,
i32: i32,
f32: f32,
vec_i32: Vec,
cell: std::cell::Cell,
}
println!("{:?}", SomeOptions::default());
// SomeOptions { string: "", i32: 0, f32: 0.0, vec_i32: [], cell: Cell { value: 0 }
自分で実装する場合はimpl Default
から::default
を実装してあげます。
#[derive(Debug, PartialEq)]
struct MyNumber(i32);
impl Default for MyNumber {
fn default() -> Self {
MyNumber(33)
}
}
assert_eq!(MyNumber::default(), MyNumber(33));