Move语言 循环语句

在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。

在 Move 中定义循环有两种方法:

  1. while 条件循环
  2. loop 无限循环

条件循环

while 是定义循环的一种方法:在条件为真时执行表达式。只要条件为 true,代码将一遍又一遍的执行。条件通常使用外部变量或计数器实现。

script {
    fun main() {

        let i = 0; // define counter

        // iterate while i < 5
        // on every iteration increase i
        // when i is 5, condition fails and loop exits
        while (i < 5) {
            i = i + 1;
        };
    }
}

需要指出的是,while 表达式就像 if 表达式一样,也需要使用分号结束。while 循环的通用语法是:

while (<布尔表达式>) <表达式>;

与 if 表达式不同的是,while 表达式没有返回值,因而也就不能像 if 那样把自己赋值给某变量。

无法访问的代码

安全是 Move 最显著的特性。出于安全考虑,Move 规定所有变量必须被使用。并且出于同样的原因,Move 禁止使用无法访问的代码。由于数字资产是可编程的,因此可以在代码中使用它们(我们将在 Resource 一章中对其进行介绍)。而将资产放置在无法访问的代码中可能会带来问题,并造成损失。

这就是为什么无法访问的代码如此重要的原因。

无限循环

Move 提供了一种定义无限循环的方法,它没有条件判断,会一直执行。一旦执行该代码将消耗所有给定资源(交易费),大多数情况下,编译器也无法判断循环是否是无限的,也就无法阻止无限循环代码的发布。因此,使用无限循环时一定要注意安全,通常情况下建议使用 while 条件循环。

无限循环用关键字 loop 定义。

script {
    fun main() {
        let i = 0;

        loop {
            i = i + 1;
        };

        // UNREACHABLE CODE
        let _ = i;
    }
}

下面的代码也是可以编译通过的:

script {
    fun main() {
        let i = 0;

        loop {
            if (i == 1) { // i never changed
                break // this statement breaks loop
            }
        };

        // actually unreachable
        0x1::Debug::print<u8>(&i);
    }
}

对于编译器而言,要了解循环是否真的是无限的,这是一项艰巨的任务,因此,就目前而言,只有开发者自己可以帮助自己发现循环错误,避免资产损失。

Move语言提供continue 和 break 关键字,允许程序跳过一轮循环或中断循环。例如,我们在 loop 中添加两个条件,如果 i 是偶数,我们通过 continue& ...