構造体・列挙型・パターンマッチ
値を、自分の意味に合わせて設計します。
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 } を作り、各状態に違う文字列を返す関数を書いてください。