Ccmmutty logo
Commutty IT
4 min read

第12話 V言語の配列

https://cdn.magicode.io/media/notebox/blob_DCr92mW
カサレリア。katzenです。
前回、V言語で超簡単なゲームをつくる3で、ゲームループを加え、ランダム処理まで進めることが出来ました。
今回は、配列について紹介したいと思います。

基本

まずは基本から
初期化は[ ]でくくり、,カンマで区切ります。
参照は[<インデックス>]で0スタートです。マイナスインデックスは使用出来ません。
iarr := [1,2,3]
println(iarr)
// [1,2,3]

println(iarr[1])
// 2

sarr := ["一","二","三"]
println(sarr)
// ['一', '二', '三']

追加

追加は<<を使用します。 mutをつけることに注意しましょう。
mut src := [1,2,3]
src << 4 // = は必要ありません。
println(src)
// [1,2,3,4]
src << [5,6,7] // 配列ごと追加できます。
println(src)
// [1,2,3,4,5,6,7]

存在チェック

existsみたいな感じですね。
<値> in <配列>という様に書きます。
color := ['red','green','blue']
println('red' in color)
// true
println('yellow' in color)
// false

配列長

lenで取得できます。
l := [1,2,3]
println(l.len)
// 3

宣言と初期化

データはまだないけど、メモリは確保しておきたい場合や、初期値としてなにかを設定したい場合に使用します。
書き方はgolangに近いですね。
mut <変数> := []<型>{len:<値>,cap:<値>,init:<値>}
lenは配列長、capはメモリ長,initは初期値です。
mut ml := []int{len: 5,cap: 8,init: 2}
println(ml.len) // 5
println(ml.cap) // 8
println(ml)
// [2,2,2,2,2]

mut buff := []int{} // パラメータは省略も可能です。
println(buff.len)  // 0
println(buff.cap)  // 0
buff << 1
println(buff.len)  // 1
println(buff.cap)  // 2 2の倍数単位でメモリを確保する様子

it

特殊な予約語で、宣言時は0から1づつ加算した値を返します。
例を見てもらったほうがいいでしょう。
count := []int{len:5,init:it}
println(count)
// [0,1,2,3,4]

count2 := []int{len:5,init:it*it}
println(count2)
// [0,1,4,9,16]
filter,map,anyなどでも出てきますが、その場合は格納している値を指す特殊な予約語です。

多次元配列

mut cross := [][]int{len:3,init:[]int{len:2,init:-1}}
println(cross)
// [[-1, -1], [-1, -1], [-1, -1]]
cross[1][1] = 9
println(cross)
// [[-1, -1], [-1, 9], [-1, -1]]

複製

配列など別の変数に代入した場合、言語によってはアドレスポインタのコピーですが、V言語ではまるっとコピーすることを期待します。 そのため、配列を別の変数に入れる場合、cloneを使用します。
mut src := [1,2,3]
// copy := src error
copy := src.clone()
src[1] *= 10
println(copy)
// [1,2,3]

条件による抽出

filterを用いて条件にあった値を取得します。
base := [5,4,3,2,1]
even := base.filter(it % 2 == 0) //偶数だけ取得。
println(even)
// [4,2]

一律で値を処理する

mapを使用して格納している値全てを処理することが出来ます。 Scalaとか馴染みがあるかもしれませんね。
orig := [1,2,3]
next := orig.map(it*3)
println(next)
// [3,6,9]

条件一致

配列の値が条件に合致するか判定するメソッドがあります。
anyは配列の中身でどれか1つでも適合するかの判定に使います。
allは配列の中身がすべて条件に適合するかの判定に使います。
box := [1,10,100]
println(box.any(it < 10)) // 10以下の値を含む true
println(box.all(it %2 == 0)) // すべて偶数 false
長くなってしまったので、今回はここで。
最後に、jsやphpと違い、配列要素に違う型を混ぜることは出来ないことをお伝えしたいと思います。
any := [1,2,"3"]
// invalid array element: expected `int`, not `string`
圧倒的な物量で攻めてくる配列処理。
次回「V言語の配列2」見てください!

Discussion

コメントにはログインが必要です。