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