Tips

2019.08.21

V言語 3つのforループ

V言語 3つのforループ

概要

V言語にはforループ以外のループ文は存在しない(バージョン0.1.18時点)。
しかし、実際には以下の3種類のfor文に分類できる。

  1. 手動ストップのfor文(他言語のwhile文に相当)
  2. カウンターによるfor文(他言語のfor文に相当)
  3. 配列の各要素に対するfor文(他言語のforeach文に相当)

なお、いずれの場合も、制御節には()をつけてはならない。
そして、実行節には{}をつけなければならない。

手動ストップのfor文

フォーマット

他言語のwhile文に相当する1
そのままでは無限ループになるので、必ず停止条件を記載すること。
スキップ条件は、必要に応じて記載すればよく、あってもなくてもかまわない。
breakcontinueの意味は、C#などと同じである。

条件に使う変数の初期値を代入
for {
    if 停止条件 {break}
    if スキップ条件 {continue}
    
    正常系での実行操作
    条件の操作変更
}

コード例

// # while的forループ
fn main(){
    // ## ループカウントの初期値設定
    mut loop_count := 0
    for{
        // ## ループ終了条件
        // break文でも{}は省略できない
        // `match loop_count {10 => break}`でも同様の結果
        if loop_count == 10 {break}

        // ## ループのスキップ条件
        // 2018/08/16時点ではcontinueは使えない
        // if loop_count % 2 == 0  {continue}

        // ## 正常系の動作
        println('current_loop_count : ${loop_count}')

        // ## ループカウントの変更
        loop_count++
    }
}

実行結果

カウンターによるfor文

フォーマット

他言語で一般的にfor文として扱われるものと同じである。
公式ドキュメントでは横に制御節の各文を並べているが、
縦長にするほうが読みやすさでは勝る。
(for文は横長になりすぎる傾向にあるので、
それを避ける目的がある)

for  
    カウンター := 初期値; 
    カウンターの限界条件; 
    カウンターの変動式
{
    実行操作
}

コード例

// # 典型的なforループ(カウンタ―制御型)
fn main(){
    // ## ループ制御節
    // ()はつけてはいけない
    // 横長になりがちなので、縦に改行してそろえる
    for
        loop_count := 0;
        loop_count <= 10;
        loop_count++
    // ## ループ実行節
    {
        println('loop_count : ${loop_count}')
    }
}

実行結果

配列の各要素に対するfor文

配列の各要素に対する操作を加えるときにはこの構文を用いる。
カウンタ―を使うfor文でよく起こる、インデックスの始まりと終わりを間違えて、
存在しない要素を要求するエラーを防ぐためである。

フォーマット1 インデックス付き

配列のインデックスをループ内で直接取得できるのはV言語の特徴である。
メジャーな言語の中で、この構文をサポートしていない言語は多い23

for 番号, 値 in 配列 {
    配列の各要素に対する実行操作
}

フォーマット2 インデックス抜き

多くの言語でもある、要素の値のみを抜き出すfor文である4

for 値 in 配列 {
    配列の各要素に対する実行操作
}

コード例

// # 配列を対象としたfor文(他言語のforeach文に相当)
fn main(){
    // ## 配列
    some_fibonaccis := [1, 1, 2, 3, 5, 8, 13]

    // ## インデックス付きループ
    for index, element in some_fibonaccis{
        println('some_fibonaccis[${index}] : ${element}')
    }

    // ## インデックス抜きループ
    for element in some_fibonaccis{
        println('square of this fibonacci is : ${element * element}')
    }
}

実行結果


脚注

1 例えば、C#では以下のようにwhile(true)の無限ループと、停止条件他を組み合わせる。

ループ条件に使う変数の初期値を代入;
while (true)
{
    if (停止条件)     { break; }
    if (スキップ条件)  { continue; }
                
    実行操作;
    ループ条件に使う変数の値を変更;
}
2 例えば、C#では以下のように補助メソッドを付け足して書く必要がある。

foreach (var 要素 in 配列.Select((値, 番号) => new { 番号, 値})){
    // 実行操作
    Console.WriteLine($"{要素.番号} : {要素.値}");
}
3 Pythonでは以下のように補助関数を使う必要がある

for(番号, 値 in enumerate(配列)){
    // 実行操作
    print(f"{番号} : {値}")
}
4 一つだけ例を挙げると、C#では以下のようになる。

foreach(var 値 in 配列){
    // 実行操作
}

参照

  1. V言語公式リポジトリ
  2. V言語公式ドキュメント
  3. V言語変更履歴

Recent News

Recent Tips

Tag Search