入門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章はこれで終わり。多値を返したり、レキシカルスコープなどのある部分はまた次に。