いきなり丸投げの関連リンク
Lua 5.4 の目玉は to-be-closed variable だと思うんだけど、lua.org の説明 見ても、書き方がさっぱり分からない (そもそもサンプルコードもないぞ)。
上記の日本語の解説ページを見てやっと分かった。こんな感じでいいらしい
function new() return setmetatable({},{ __close = function(this) print("__closed called") end , __gc = function(this) print("__gc called") end } ) end do local x<close> = new() print("Block ends") end print("Program terminated")
$ lua54 foo.lua Block ends __closed called Program terminated __gc called
<close>
という修飾子を変数の後につけると、その「変数」の有効範囲を抜けた時に、メタテーブルの __close
に登録されたメソッドが呼び出されるらしい。
これはリソースの後片付けに便利!
(Lua から COM オブジェクトを呼ぶ時、後片付けに Release というメソッドをいちいち呼ばなくてはいけなかったんよ)
だけど、なんでパーサーが大変な <close>
なんて表現にしたかなぁ。local x<close>=
ではなく、 using x =
みたいな方が楽だと思うんだけど。謎だ
Dependency Walker で依存ファイルを確認した。
lua54.dll は MSVCRT.dll にしか依存していない。
lua54.exe も lua54.dll と MSVCRT.dll にしか依存していない。
普通に MinGW/gcc でビルドすると、DLL が MinGW のランタイムを必要としてしまうが、そうなっていないところを見るとまた古めの MinGW でビルドしてるのかな?