バリアントとパターンマッチング

ケースごとのデータをまとめて保存し、matchから安全に分離します。

Wave Foundation

enumと区別

enumは名前付き整数値を表し、variantは場合ごとに異なるpayloadを含みます。下のResultは、成功した場合のi32の値、失敗した場合のi32エラー番号を格納します。エラーと結果が同じ整数型であっても、名前で意味を区別できます。

宣言・生成・検査

main.waveに保存して実行します。

variant Result {
    Value(i32), Error(i32)
}

fun calculate(valid: bool) -> Result {
    if (!valid) {
        return Result::Error(1);
    }

    return Result::Value(42);
}

fun main() {
    var result: Result = calculate(true);
    match (result) {
        Result::Value(value) => {
            println("value={}", value);
        }
        Result::Error(code) => {
            println("error={}", code);
        }
    }
}

実行結果:

value=42

Result::Value(42)がpayloadの場合を作成します。 matchの対応するパターン内でのみvalueという名前でpayloadを使用します。他の場合のpayloadを強制的に読みません。 arm本文はブロックで作成します。すべてのケースを処理するか、_で残りを処理します。新しいケースを追加したときに処理が必要かどうかを明らかにするには、各ケースを明示的に分割することをお勧めします。

ジェネリックと寿命

型パラメータはvariant Optional<T> { Some(T), None }のように使用できます。 Optional<i32> など、ローカル変数の具体的な型を指定します。ポインタを含むバリアントは、メモリの所有権を自動的に管理しません。値をコピーしても、ポイントされた割り当ては複製されません。

variantのメモリ表現を任意のCunionと同じと仮定しないでください。外部ABIに送信するデータは別々の表現を決め、許可されたFFIタイプに渡します。

練習

calculate(false)に変更すると、error=1が出なければなりません。 payloadのないEmptyケースを追加した後、matchでもそのケースを処理してみてください。

構造体とenum · エラー処理クラス