Skip to content

forループ

一連の要素に対して同じ操作を順番に行いたい場合、forループが適切なツールです。YaoXiangのforループはシンプルで正確な設計です。

基本構文

構文仕様におけるfor文の形式定義:

for 'mut'? Identifier 'in' Expr Block

解釈すると、forで始まり、オプションでmutを付けることができ、次にループ変数名、その後にinと反復する式、最後にループ本体のコードブロックが続きます。

数字範囲の反復処理

最も一般的な使い方は..で範囲を作成し、forで反復することです:

yaoxiang
// 0から4まで(5は含まない)
for i in 0..5 {
    print(i)
}
// 出力:0 1 2 3 4

0..5は0から始まり(含む)、5で終わる( 含まない)範囲を表します。これはコンピュータサイエンス分野での一般的な慣例——左閉右開区間です。

変数を使って範囲の始点と終点を定義することもできます:

yaoxiang
start = 10
end = 15
for n in start..end {
    print(n)
}
// 出力:10 11 12 13 14

リストの反復処理

forは数字範囲だけでなく、リストや配列などのコレクションを直接反復処理することもできます:

yaoxiang
colors = ["赤", "橙", "黄", "緑", "青"]

for color in colors {
    print("現在の色: " + color)
}
// 出力:
// 現在の色: 赤
// 現在の色: 橙
// ... 以下同様

forの独特なセマンティクス:各反復で新しい束縛を生成

YaoXiangのforループには、他の言語とは異なる設計があります:各反復は同一の変数を変更するのではなく、新しい束縛を生成します

表で理解しましょう:

反復发生的事情
1回目新しい束縛i = 0を生成し、ループ本体を実行してから束縛を破棄
2回目新しい束縛i = 1(全く新しい束縛)を生成し、ループ本体を実行してから破棄
3回目新しい束縛i = 2を生成し、ループ本体を実行してから破棄
......
ループ終了範囲が使い果たされ、ループが终止

つまり、各反復のループ変数は独立した新しい値です。これは安全性に大きく貢献します——ループ変数が誤って変更される心配がありません:

yaoxiang
for i in 1..5 {
    // i = i + 1   // エラー:デフォルトで不変、iを変更できない
    print(i)
}

for mut:変更が必要な場合に明示的に宣言

ループ本体内でループ変数を変更する必要がある場合(例えばアキュムレータとして使う場合など)は、for mutを使います:

yaoxiang
// for mutはループ本体内の束縛変更を許可する
for mut i in 0..5 {
    i = i * 2
    print(i)
}
// 出力:0 2 4 6 8

注意:for mutを使用しても、各反復は依然として新しい束縛です。for mutは新しい束縛本身を変更可能にするだけで、前回の反復での変更が次の反復伝わることはありません。

yaoxiang
for mut i in 1..5 {
    i = i + 100
    print(i)        // 常に101、102、103、104が出力される
}
// 各反復でiは範囲の値から 새롭게開始され、前回の変更は次の反復に影響しない

ループ変数は外側の変数をシャドウできない

YaoXiangは変数のシャドウイングを禁止しています。forのループ変数は外側のスコープの変数と同じ名前を持つことはできません:

yaoxiang
// 間違いの例
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ループ——条件に基づいて繰り返す標準的な方法について学びます。