Move语言 循环语句
在不少实际问题中有许多具有规律性的重复操作,因此在程序中就需要重复执行某些语句。一组被重复执行的语句称之为循环体,能否继续重复,决定循环的终止条件。
在 Move 中定义循环有两种方法:
while
条件循环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& ...