V言語 3つのforループ
概要
V言語にはforループ以外のループ文は存在しない(バージョン0.1.18時点)。
しかし、実際には以下の3種類のfor文に分類できる。
- 手動ストップのfor文(他言語のwhile文に相当)
- カウンターによるfor文(他言語のfor文に相当)
- 配列の各要素に対するfor文(他言語のforeach文に相当)
なお、いずれの場合も、制御節には()
をつけてはならない。
そして、実行節には{}
をつけなければならない。
手動ストップのfor文
フォーマット
他言語のwhile文に相当する1。
そのままでは無限ループになるので、必ず停止条件を記載すること。
スキップ条件は、必要に応じて記載すればよく、あってもなくてもかまわない。
break
とcontinue
の意味は、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($"{要素.番号} : {要素.値}");
}