Nimのデータ型
けれどメモしておきたいような細かいのとか
固定長配列
固定長なので長さを変更できない
つまり要素を追加したり削除したりできない
配列の長さも型情報に含まれる
よって以下のコードはコンパイルエラーになる
array.nimvar arr = [1, 2, 3]
arr = [1, 2]
echo arr
$ nim c -r array.nim
> array.nim(2, 5) Error: type mismatch: got <array0..1, int> but expected 'array0..2, int'
長さが同じならコンパイルが通る
array2.nimvar arr = [1, 2, 3]
arr = [2, 3, 4]
echo arr
ちなみに末尾の要素に ,
が残っていてもコンパイルエラーにはならない
2の後ろに ,
があるがコンパイルが通る
可変長配列
他の言語ではリスト、スライスとかいわれたりする
要素の追加、削除が可能
要素の長さが異なる状態での再代入も可能
@
を使って宣言する
nimvar seq1 = @[1, 2, 3]
var seq2: seq[int] = @[1, 2, 3]
後ろから何文字目というアクセスの仕方もできる
pythonでいう [1, 2, 3][:-1]
というやつ
nimecho "hello world"[6..^1] # -> world
echo "hello world"[^1] # -> d
arrayとseq両方とマッチする特殊な型
openArray[string]
みたいに書く
sample.nimproc total(n: openArray[int]): int =
for i in n:
result += i
プロシージャの引数にしか指定できない
プロシージャの戻り値には指定できない
ネストしたopenArrayは指定できない
openArray[openArray[string]]
はコンパイルエラーになる
あきらめて seq[seq[string]]
と書く
複数値を返す型
オブジェクトの定義を省略していきなり宣言できる
これかなり嬉しい
また、タプルの時はそれぞれ別の変数として代入することもできる
tuple.nimproc newTuple(): (string, string) =
return ("hello", "world")
let t = newTuple()
echo t # -> ("hello", "world")
echo t[0] # -> hello
echo t[1] # -> world
# 複数に変数にそれぞれ代入できる
let (h, w) = newTuple()
echo h # -> hello
echo w # -> world
他の言語では連想配列、ハッシュマップ、辞書型とかいわれたりする
テーブルって名前は他の言語だとあまり聞かなくてググってもヒットしなくて苦労した
nimimport tables
var a = {"hi": 1, "there": 2}.toTable
echo a["hi"], " ", a.len
assert a.hasKey("hi")
for key, value in a:
echo key, " " ,value