对常量值的模式匹配可以实现为跳转表或一系列条件跳转 - 就像 switch 语句一样。允许范围并不会改变这种情况。
Rust 枚举(至少具有成员的枚举)被实现为带标记的联合体,即包含标记和包含成员的结构体的联合体。
然后,对枚举的模式匹配就简单地被翻译为对其标记的 switch(同时将模式绑定的变量绑定到联合体的成员)。所以 Rust 代码中的这个东西:
enum Result {
SingleResult(i32),
TwoResults(i32, i32),
Error
}
match someResult {
Result::SingleResult(res) => f(res),
Result::TwoResults(res1, res2) => g(res1, res2),
Result::Error => error()
}
会被翻译成与以下C代码相同的机器码(大概率):
struct Result {
enum {
SingleResult, TwoResults, Error
} tag;
union {
struct {
int arg1;
} singleResult;
struct {
int arg1;
int arg2;
} twoResults;
} value;
};
switch(someResult.tag) {
case SingleResult: {
int res = someResult.value.singleResult.arg1;
f(res);
break;
}
case TwoResults: {
int res1 = someResult.value.twoResults.arg1;
int res2 = someResult.value.twoResults.arg2;
g(res1, res2);
break;
}
case Error: {
error();
break;
}
}