Варианты и сопоставление шаблонов
Храните данные, относящиеся к конкретному случаю, вместе и безопасно отдельно от 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.