Nimのデータ型
Nimのデータ型についてです。
基本的なデータ型
Nimの基本的なデータ型としては、
- int
- int8
- int16
- int32
- int64
- uint
- uint8
- uint16
- uint32
- uint64
- float
- float32
- float64
- bool
- char
- string
- cstring
などがあります。 先頭にuがついているものはCでいうunsignedで、末尾の数字はビット数を表しています。
コンテナ型
そしてそれらを包含するコンテナ型があります。Nimのコンテナ型はそれぞれが使いやすく、演算子オーバーロードがあり、シンタックスシュガーが用意されているのでとても書きやすいです。
コンテナ型でよく使うものとしては、
- array
- seq
- varargs
- openarray
- Table
ちなみに下記の例では分かりやすさのため変数に型を明示的に付けているものもありますが、この程度ならNimのコンパイラは型推論してくれるので省略可能です。
array
arrayは静的配列です。
var arr: array[5, int] = [1, 2, 3, 4, 5]
seq
seqは動的配列です。@をつけることで作成可能です。
var arr: seq[int] = @[1, 2, 3, 4, 5]
varargs
varargsは可変長引数に使います。 ちなみに@をつけることでseqに変換可能です。
proc echoVariadic(args: varargs[int]) = echo @args echoVariadic(1, 2, 3, 4, 5)
さらに、varargsで可変長引数を受け取る際に、任意の変換処理を行うことができます。
proc toInt(value: string): int = case value of "1": return 1 of "2": return 2 else: return 0 proc echoVariadic(args: varargs[int, toInt]) = echo @args echoVariadic(1, 2, "1", "2")
openarray
openarrayは配列を汎用的に扱う型です。
例えば、arrayとseq両方で使える関数を作ったりするのに使えます。
proc echoHead(arr: openarray[int]) = echo arr[0] echoHead([1, 2, 3, 4, 5]) echoHead(@[1, 2, 3, 4, 5])
Table
Tableはハッシュテーブルで、標準ライブラリtablesをimportすることで使えます。
他にも順序が付いたOrderedTableなどもあります。
var agetable = initTable[string, int]() agetable["genji"] = 35 agetable["hanzo"] = 38 agetable["mercy"] = 37 echo agetable["genji"]
ポインタ型
- pointer
- ptr
- ref
pointer
pointerは生ポインタ型で、Cでいうvoid*です。基本的にはCとの連携の際に使うもので、Nimに閉じたプログラムを書く際に必要になることは無いと思います。
ptr
ptrは型がついたpointerです。これも基本的にはCとの連携の際に使うことが多いでしょう。
ref
refも型がついたpointerなのですが、ptrとrefはGCで管理されるかどうかの違いがあります。
ptrはGCで管理されず、refはGCで管理されます。
まとめ
以上がNimのデータ型でよく使うものです。ただし後半のポインタ型はデータ定義のobjectなどと密接に関係してくるもので、少し分かりにくい説明になったと思います。データ定義などの部分はまた別の記事で書きたいと思います。