入門Luaプログラミング第7章 Luaの仕組み(前編)
文字列、テーブルの仕組みや、GCの扱い、データ型などちょっと奥の深い章。今回はなかなかおもしろそう。
文字列と登録台帳の仕組み
文字列は宣言された時点で登録台帳に登録され、2つ目以降は登録台帳の同じものを指すようになる…らしい。
> a = "aaa" -- "aaa"が登録台帳に登録され、変数aはその文字列を指す > if (a == "aaa") then -- 右辺値は既に登録されているので変数aと同じ文字列を指している >> print(a) >> end aaa > b = "123" > c = "123" -- 変数bと同じ文字列を指す > if (b == c) then >> print(b) >> end 123
GC
インクリメンタルGC……とかいうやつらしい。(参照カウントとマーク&スイープくらいしか知らない……)
> a = "aaa" .. "bbb"
とすると、"aaa"と"bbb"が台帳に登録されたあと、連結された文字列が登録され、"aaa"と"bbb"がGCによって片付けられる。
片付けてくれるのはいいけど、頻繁に片付けられると困るときにはcollectgarbage関数を使うとGCを制御できる。
collectgarbage(stop)で止めて、collectgarbage(restart)で再起動を。collectgarbaget(collect)でGCの実行。
print(collectgarbage(count))をやっても毎回0なのはなんでなんだろう……
テーブルの仕組み
テーブルは文字列と違って、個々に生成されるので比較した場合は別のものとして扱われる。
> a = { aaa = 123 } > b = { aaa = 123 } > if (a ~= b) then >> print("not equal") >> end not equal
"b = { aaa = 123 }"を"b = a"にするとこの場合一致する。ポインタみたいなものかな。
関数
関数はデータなので変数に代入可能。JavaScriptだったり、その他の言語でも使われる方法ができたり。
> functoin aaa() >> print("aaa") >> end > bbb = aaa > bbb() aaa > ccc = function () >> print("ccc") >> end > ccc() ccc > puts = print > puts("puts -> print") puts -> print
データ型
何でも変数に入れたりできるけれど一応、変数にも型が。
> print(type(nil)) nil > print(type(1)) number > print(type("a")) string > print(type({123})) table > print(type(true)) boolean > print(type(function () end)) function
この他に、"thread"と"userdata"がある。
前者はコルーチンのスレッドに、後者はファイルハンドルなどで返される……らしい。
可変長引数の関数
関数宣言時に引数の部分に"..."とすることで可変長引数を受け取ることができる。
> function args(...) >> local list = {...} >> for i = 1, table.getn(list) do >> print(list[i]) >> end >> end > args(1,2,3) 1 2 3 > args("a", 2) a 2
うーん、可変長引数受け取るような関数を自分で作る気がしないなあ……
途中だけれど眠いので7章はこれで終わり。多値を返したり、レキシカルスコープなどのある部分はまた次に。