基本
while は、bool 条件が true のままである限り本体を走らせます。
while condition {
// 本体
}
コンパイラーは各反復の前に条件を評価します。
true——本体を実行し、再びチェックする。false——ループを終える。
Zero のサンプルから取った些細な例で、条件が初めから false のものです。
これを実行すると 2 つ目の write だけが発火します。while の本体は決して実行されません——最初にチェックされたときに条件が false だったからです。
条件は bool
if/else と同様に、ループ条件は bool でなければなりません。Zero は整数や文字列など他の値をブーリアンに強制変換しません。
while count { // コンパイルエラー
// ...
}
while count > 0 { // OK
// ...
}
条件は bool に評価されるものなら何でも構いません——バインディング、比較、&&/|| の組み合わせ、関数呼び出し。if と同じルールが適用されます。
カウントループ
「N 回何かをする」という古典的なパターンは、カウンターと while を使います。
let mut i = 0
while i < 10 {
// 仕事をする
i = i + 1
}
3 つのピース: 初期値、上限と比較する条件、本体内での更新。すべての命令型言語が持つパターンを、Zero は for キーワードで飾り立てないだけです。
上の mut の綴りについて: お使いのツールチェーンが Zero で可変バインディングをどう綴るかは pre-1.0 バージョンで異なる場合があります。小さなテストに対して zero check --json を実行して、お使いのコンパイラーが受け入れる正確な構文を確認してください。概念的なパターン(カウンター + 条件 + 更新)が安定した部分です。
無限ループ
条件が常に true の while は永遠に走ります。
while true {
// 仕事を待ち、処理し、再びループする
}
これがイベントループ、REPL、長時間動作するサーバーの正しい形です。終了するには、プロセスを終了するか、本体からエラーを raise するか、条件が壊れるよう再構造化します。
いつループに手を伸ばすか
ループは控えめに使う道具です。他の言語でループに見えるものは、Zero ではしばしばよりクリーンな形を持ちます。
- 固定コレクションに対する反復: 標準ライブラリやあなたのシェイプが公開する関数——
forEachスタイルのヘルパー、フォルダー、再帰的なウォーク——を選びましょう。 - 入力の終わりまで読む: 失敗しうる読み取りでループしつつ、ステータスフラグをネストするのではなく、
checkとraisesで境界を綺麗にハンドリングします。 - 条件のポーリング: デザインがシグナルを渡すべきかを検討しましょう。ポーリングループはどんなシステム言語でも臭いがします。
同じ直感はエージェントにも適用されます——きつく宣言的な形は、手書きのカウンターループより、人間にもコードジェネレーターにも推論しやすいです。
ループとエフェクト
while の本体も、他のブロックと同じく I/O を行えます——ただし World ケイパビリティ(あるいはその一部)にアクセスできる場合だけです。シグネチャに World を言及しない関数はいくらでもループできますが、外に何も書き込めません。その性質はループ本体の内側でも保たれます——ループは新しいケイパビリティを与えません。
これは当たり前に聞こえますが、「純粋」な計算関数の中に while を入れても、シグネチャだけから何も表示しないしディスクに書き込まないと判断できる理由になります。
スタイルメモ
役に立つ小さな習慣をいくつか。
- 条件をはっきりさせる。条件が実際の仕事をしているなら、名前付き関数やバインディングに持ち上げて、ループが読みやすくなるようにしましょう。
- カウンターの更新は本体の底でまとめる。あちこちに散らさない。オフバイワンのバグを見つけやすくなります。
- 反復の途中で反転するフラグよりも、ループ自身の条件として表現できる早期終了条件を選ぶ。動く部品が減ります。
次回: シェイプ
これで Zero の中核的な制御フローを見終えました。次の章はデータのモデリング——シェイプ、Zero の構造体ライクな直積型——から始まります。
よくある質問
Zero の while ループはどう動きますか?
while 条件 { ... } を使います。各反復の前に条件が評価され、true なら本体が走り、もう一度チェックされます。false ならループは終了し、閉じ括弧の後ろから実行が続きます。条件は bool でなければなりません。
Zero に for ループはありますか?
初期の Zero は唯一のループ構文として while を出荷しています。安定化の間、言語は意図的に表面を小さく保ちます——キーワードが少ないほど、エージェントが間違った形を選ぶ余地が減ります。範囲やコレクションに対する for は後で登場するかもしれませんが、それまでは while とカウンターで同じパターンを組み立てます。
Zero でカウントループはどう書きますか?
カウンターを初期化し、それに対して while を回し、本体内で更新します。let mut i = 0; while i < 10 { ...; i = i + 1 }。可変性の構文は pre-1.0 Zero でまだ進化中なので、正確な綴りは現行のドキュメントを確認してください——ただし「while + カウンター + 更新」のパターンが標準的なカウントループのイディオムです。
Zero に break や continue はありますか?
Zero ファミリーの言語のほとんどはループの早期終了構文を出荷しています。pre-1.0 Zero での正確な綴りは 1.0 までに動く可能性のある面のひとつです。保守的なアプローチは、条件自体が仕事をするようにループを構造化すること——特定の制御フローキーワードに頼るのではなく、条件を反転・更新してループが自然に終了するようにする——です。
Zero の while ループは永遠に走ることができますか?
はい——while true { ... } は無限ループです。サーバー、イベントループ、REPL、自然な終了条件がないもの全般に役立ちます。暗黙の真偽値解釈とは違って、ここでの true は bool 型のリテラルなので、条件は依然として正しく型付けされています。