構造体を定義する為に使います。例えば長方形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));