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