章一覧

構造体・列挙型・パターンマッチ

値を、自分の意味に合わせて設計します。

5.1 フィールドのある値

複数の値を一つにまとめるには struct を使います。フィールドは . で参照します。

ch05-struct.taut
fn absolute(x: i64): i64 {
  if x < 0 { 0 - x } else { x }
}

struct Point { x: i64, y: i64 }

fn manhattan(p: Point): i64 {
  absolute(p.x) + absolute(p.y)
}

let origin := Point { x: 0, y: 0 }
let delta := Point { x: 3, y: 4 }
perform show("distance", manhattan(delta))
実行結果
・ absolute
・ manhattan

distance = 7
distance = 7

プログラムを分割するときは、必要な関数が見えるように、定義するか import します(第 12 章)。

5.2 選択肢を一つにまとめる

enum は、値が取り得る形を、有限個の構成子で表します。標準の Option(A) は、値がない場合とある場合を区別します。

ch05-option.taut
fn unwrap_or(x: Option(i64), fallback: i64): i64 {
  match x {
    None => fallback
    Some(value) => value
  }
}

let a := unwrap_or(Some(12), 0)
let b := unwrap_or(None, 99)
perform show("a", a)
perform show("b", b)
実行結果
・ unwrap_or

a = 12
b = 99
a = 12
b = 99

型の適用は Option<i64> ではなく Option(i64) と書きます。型を作る関数に引数を渡す、統一された表記です。

5.3 match の網羅性

ch05-light.taut
enum Light { Red, Yellow, Green }

fn instruction(x: Light): Text {
  match x {
    Red => "止まれ"
    Yellow => "注意"
    Green => "進め"
  }
}

perform show("light", instruction(Yellow))
実行結果
・ instruction

light = "注意"
light = "注意"

すべての選択肢の腕を書くので、Light に新しい構成子が増えたときに、直す場所が分かります。_ => で残りをまとめることもできますが、明示的に列挙したほうが、変更に気づきやすくなります。

演習 5.1:enum Temperature { Cold, Warm, Hot } を作り、各状態に違う文字列を返す関数を書いてください。