变体和模式匹配

将特定于案例的数据存储在一起并与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 的内存表示与任何任意 C union 相同。对于要外部发送的数据ABI,确定单独的表达式并将其作为允许的FFI类型传递。

练习

如果将其更改为calculate(false),您应该得到error=1。尝试添加不带 payload 的情况 Empty,然后也在 match 中处理该情况。

结构及enum · 错误处理类