Варианты и сопоставление шаблонов

Храните данные, относящиеся к конкретному случаю, вместе и безопасно отдельно от 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. Используйте payload под именем value только внутри соответствующего шаблона match. В других случаях чтение payload не является обязательным. arm Текст записывается блоками. Все дела и остальное обрабатывайте с помощью _. Лучше явно разбить каждый случай, чтобы определить, нужна ли обработка при добавлении нового случая.

Дженерики и долголетие

Параметры типа можно использовать, как в variant Optional<T> { Some(T), None }. Укажите конкретный тип локальных переменных, например Optional<i32>. Вариант, содержащий указатель, не управляет автоматически владением памятью. Копирование значения не дублирует указанное выделение.

Не предполагайте, что представление в памяти variant идентично любому произвольному C union. Для отправки данных наружу ABI определяется отдельное выражение и доставляется как разрешенный тип FFI.

практика

Если вы измените его на calculate(false), вы должны получить error=1. Попробуйте добавить регистр Empty без payload, а затем обработать этот регистр также и в match.

Структура и enum · Класс обработки ошибок