Struct

構造体を定義する為に使います。例えば長方形Rectangleは以下のように定義できます。

struct Rectangle {
  width: u32,
  height: u32,
}

このwidthheightのような値のことをフィールドと呼びます。

このインスタンスを作る時はこのようにします。

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<i32>,
  cell: std::cell::Cell<i32>,
}

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));