Menu

Zero While 循环:智能体优先语言中的迭代

Zero 目前的 while 循环怎么用:条件、循环体、早期版本为什么没有 for 和 do-while,以及循环和显式副作用有什么关系。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

基础用法

只要 bool 条件保持为 true,while 就会一直执行循环体:

while condition {
    // body
}

编译器在每次迭代前计算条件:

  • true:执行循环体,然后再次检查。
  • false:退出循环。

下面是 Zero 示例中的一个简单演示,它的条件一开始就是 false:

运行它,只有第二个 write 会执行。while 的循环体一次也不会运行,因为第一次检查时条件就是 false。

条件必须是 bool

和 if/else 一样,循环条件必须是 bool。Zero 不会把整数、字符串或其他值隐式转换为布尔值。

while count {              // compile error
    // ...
}

while count > 0 {          // OK
    // ...
}

条件可以是任何结果为 bool 的东西:一个绑定、一个比较、一个 &&/|| 组合,或者一个函数调用。if 的规则在这里同样适用。

计数循环

经典的“把某件事做 N 次”的写法,用的是一个计数器加一个 while:

let mut i = 0
while i < 10 {
    // do work
    i = i + 1
}

三个部分:初始值、与上限比较的条件,以及循环体中的更新。每一门命令式语言都有这种写法,Zero 只是没有用 for 关键字把它包装起来。

关于上面 mut 的写法:在 1.0 之前的版本中,你的工具链里可变绑定的写法可能有所不同。对一个小测试运行 zero check --json,确认你的编译器接受的确切语法。概念上的模式(计数器 + 条件 + 更新)才是稳定的部分。

无限循环

条件始终为 true 的 while 会永远运行下去:

while true {
    // wait for work, handle it, loop again
}

这正适合事件循环、REPL 或长时间运行的服务器。要退出,你可以终止进程、从循环体中抛出错误,或者调整结构让条件不再成立。

什么时候该用循环

循环是一种应该少用的工具。在其他语言里看起来像循环的东西,在 Zero 中往往有更简洁的写法:

  • 遍历固定的集合: 优先使用标准库或你的 shape 提供的函数,比如 forEach 式的辅助函数、折叠函数或递归遍历。
  • 一直读取到输入结束: 对可能失败的读取操作做循环,但用 check 和 raises 干净地处理边界,而不是嵌套一堆状态标志。
  • 轮询某个条件: 想一想设计上是否应该直接给你一个信号。在任何系统语言中,轮询循环都是一种坏味道。

对智能体来说也是同样的道理:无论是对人类还是对代码生成器,紧凑的声明式写法都比手写的计数循环更容易推理。

循环与副作用

和其他代码块一样,while 循环体也可以做 I/O,但前提是它能访问 World 能力对象(或其中一部分)。签名中没有提到 World 的函数可以随意循环,但无法向外部写入任何东西。这个性质在循环体内同样成立:循环不会授予任何新的能力。

这听起来理所当然,但正因为如此,你可以在“纯”计算函数中放一个 while,并且仅凭签名就能确定它不会打印任何内容,也不会写入磁盘。

风格建议

几个小习惯,回报很高:

  • 让条件一目了然。如果条件本身在做实质性的工作,就把它提取成一个有名字的函数或绑定,让循环读起来更清楚。
  • 在循环体的末尾更新计数器,不要分散在各处。这样更容易发现差一错误。
  • 优先把提前退出的条件写成循环本身的条件,而不是在迭代中途翻转标志。需要关注的变化越少越好。

下一步:Shape

你现在已经见过 Zero 的核心控制流了。下一章讲的是数据建模,从 shape 开始,也就是 Zero 中类似结构体的积类型。

常见问题

Zero 中的 while 循环怎么用?

使用 while condition { ... }。每次迭代前都会先计算条件:如果是 true,就执行循环体,然后再次检查;如果是 false,就退出循环,从右花括号之后继续执行。条件必须是 bool。

Zero 有 for 循环吗?

早期的 Zero 只有 while 这一种循环结构。在语言趋于稳定之前,它有意保持表面积小:关键字越少,智能体选错写法的可能就越小。针对范围或集合的 for 以后可能会加入;在那之前,你可以用 while 加计数器实现同样的效果。

Zero 中怎么写计数循环?

先初始化一个计数器,用 while 判断它,然后在循环体中更新:let mut i = 0; while i < 10 { ...; i = i + 1 }。在 1.0 之前的 Zero 中,可变性语法还在演进,具体写法请查看最新文档;但“while + 计数器 + 更新”这种模式就是标准的计数循环写法。

Zero 有 break 或 continue 吗?

与 Zero 同类的大多数语言都提供了某种提前退出循环的结构;在 1.0 之前的 Zero 中,具体写法是 1.0 之前可能还会变动的地方之一。稳妥的做法是让循环条件本身完成这项工作:通过反转和更新条件,让循环自然退出,而不是依赖某个特定的控制流关键字。

Zero 的 while 循环可以无限运行吗?

可以,while true { ... } 就是一个无限循环。它适用于服务器、事件循环、REPL,以及任何没有天然结束条件的场景。这和隐式真假值不同:这里的 true 是 bool 类型的字面量,所以条件仍然类型正确。

Coddy 编程语言插图

和 Coddy 一起学编程

开始