如何使用Rust这样的语言来实现比赛?

Jon*_*low 5 compiler-construction language-design

我不是函数程序员。因此,我对模式匹配,模式或任何其他东西不是很熟悉。对我而言,我只理解好的旧switch声明的概念。

编译器将如何实现match语句?match和switch到底有什么区别?有一个GNU C99扩展,允许您在切换的情况下具有范围,两者之间是否有区别:

match x {
    0 ... 9 => ...,
    _ => ...,
}
Run Code Online (Sandbox Code Playgroud)

switch (x) {
case 0 ... 9: ...; break;
default: ...; break;
}
Run Code Online (Sandbox Code Playgroud)

请注意,第二个片段是带有此GNU扩展名的简单C开关。

sep*_*p2k 6

可以将常量值的模式匹配实现为跳转表或条件跳转序列-就像switch语句一样。允许范围不会改变这种情况。

Rust枚举(至少带有成员的枚举)的实现类似于带标签的联合,即包含标签的结构和包含成员的结构的联合。

然后简单地将枚举上的模式匹配转换为其标记上的开关(将模式绑定的变量绑定到并集成员)。所以像这样的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()
}
Run Code Online (Sandbox Code Playgroud)

将转换为与以下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;
  }
}
Run Code Online (Sandbox Code Playgroud)