この初版はLua 5.0向けに書かれました。以後のバージョンでも大半は関連していますが、いくつかの違いがあります。
第4版はLua 5.3を対象としており、Amazonや他の書店で入手できます。
書籍を購入することで、Luaプロジェクトの支援にもつながります。


29 – リソース管理

前の章で配列を実装したときは、リソース管理の心配をする必要はありませんでした。必要なのはメモリだけです。配列を表す各ユーザーデータには独自のメモリがあり、Luaによって管理されています。配列がガベージ(プログラムからアクセスできない)になると、最終的にLuaがその配列を収集してメモリを解放します。

常に簡単に済むわけではありません。オブジェクトが、ファイル記述子、ウィンドウハンドルなど、生メモリ以外の他のリソースを必要とする場合もあります (多くの場合、これらのリソースはメモリですが、システムの別の部分によって管理されています)。そのような場合、オブジェクトがガベージになり収集されたとき、何らかの方法で他のリソースも解放する必要があります。いくつかのOO言語では、そのニーズに特化した特定のメカニズム(ファイナライザーまたはデストラクタと呼ばれる)が提供されます。Luaは__gcメタメソッドという形式でファイナライザーを提供します。このメタメソッドはユーザーデータの値でのみ機能します。ユーザーデータが収集されようとしており、そのメタテーブルに__gcフィールドがある場合、Luaはこのフィールドの値(関数の必要あり)を呼び出し、ユーザーデータ自体を引数として渡します。この関数は、そのユーザーデータに関連付けられたリソースを解放できます。

このメタメソッドとAPI全体の使用方法を示すために、この章では、Luaから外部の機能に2つのバインディングを作成します。最初の例はディレクトリをトラバースするための関数の別のインプリメンテーションです。2番目(そしてより重要な)例はオープンソースXMLパーサーであるExpatへのバインディングです。