forループ
一連の要素に対して同じ操作を順番に行いたい場合、forループが適切なツールです。YaoXiangのforループはシンプルで正確な設計です。
基本構文
構文仕様におけるfor文の形式定義:
for 'mut'? Identifier 'in' Expr Block解釈すると、forで始まり、オプションでmutを付けることができ、次にループ変数名、その後にinと反復する式、最後にループ本体のコードブロックが続きます。
数字範囲の反復処理
最も一般的な使い方は..で範囲を作成し、forで反復することです:
// 0から4まで(5は含まない)
for i in 0..5 {
print(i)
}
// 出力:0 1 2 3 40..5は0から始まり(含む)、5で終わる( 含まない)範囲を表します。これはコンピュータサイエンス分野での一般的な慣例——左閉右開区間です。
変数を使って範囲の始点と終点を定義することもできます:
start = 10
end = 15
for n in start..end {
print(n)
}
// 出力:10 11 12 13 14リストの反復処理
forは数字範囲だけでなく、リストや配列などのコレクションを直接反復処理することもできます:
colors = ["赤", "橙", "黄", "緑", "青"]
for color in colors {
print("現在の色: " + color)
}
// 出力:
// 現在の色: 赤
// 現在の色: 橙
// ... 以下同様forの独特なセマンティクス:各反復で新しい束縛を生成
YaoXiangのforループには、他の言語とは異なる設計があります:各反復は同一の変数を変更するのではなく、新しい束縛を生成します。
表で理解しましょう:
| 反復 | 发生的事情 |
|---|---|
| 1回目 | 新しい束縛i = 0を生成し、ループ本体を実行してから束縛を破棄 |
| 2回目 | 新しい束縛i = 1(全く新しい束縛)を生成し、ループ本体を実行してから破棄 |
| 3回目 | 新しい束縛i = 2を生成し、ループ本体を実行してから破棄 |
| ... | ... |
| ループ終了 | 範囲が使い果たされ、ループが终止 |
つまり、各反復のループ変数は独立した新しい値です。これは安全性に大きく貢献します——ループ変数が誤って変更される心配がありません:
for i in 1..5 {
// i = i + 1 // エラー:デフォルトで不変、iを変更できない
print(i)
}for mut:変更が必要な場合に明示的に宣言
ループ本体内でループ変数を変更する必要がある場合(例えばアキュムレータとして使う場合など)は、for mutを使います:
// for mutはループ本体内の束縛変更を許可する
for mut i in 0..5 {
i = i * 2
print(i)
}
// 出力:0 2 4 6 8注意:for mutを使用しても、各反復は依然として新しい束縛です。for mutは新しい束縛本身を変更可能にするだけで、前回の反復での変更が次の反復伝わることはありません。
for mut i in 1..5 {
i = i + 100
print(i) // 常に101、102、103、104が出力される
}
// 各反復でiは範囲の値から 새롭게開始され、前回の変更は次の反復に影響しないループ変数は外側の変数をシャドウできない
YaoXiangは変数のシャドウイングを禁止しています。forのループ変数は外側のスコープの変数と同じ名前を持つことはできません:
// 間違いの例
i = 10
// for i in 1..5 { // コンパイルエラー!iは外側で既に宣言されている
// print(i)
// }
// 正しい書き方——名前を変更する
i = 10
for j in 1..5 {
print(j)
}このルールにより、「現在のコードの変数がどの変数を指しているか」について迷うことがなくなります。
他の言語との比較
| 言語 | for ループ変数のセマンティクス |
|---|---|
| YaoXiang | 各反復で新しい束縛を生成 |
| Rust | 同一の変数を変更(mutが必要) |
| Python | 同一の変数を変更 |
| C/C++ | 同一の変数を変更 |
YaoXiangの設計は人間の直感に近づいています——「コレクション内の各要素に対してある操作を行う」——各要素は独立した存在です。
まとめ
| ポイント | 説明 |
|---|---|
| 範囲の反復処理 | for i in 0..5、左閉右開 |
| コレクションの反復処理 | for item in list、要素を一つずつ取り出す |
| 束縛のセマンティクス | 各反復で新しい束縛を生成し、同一の変数を変更しない |
| デフォルトで不変 | ループ変数は変更不可、偶発的な変更を防ぐ |
for mut | 変更が必要な場合に明示的に宣言 |
| シャドウイング禁止 | ループ変数は外側の変数と同じ名前を持てない |
次の章では、whileループ——条件に基づいて繰り返す標準的な方法について学びます。
