この最初の版はLua 5.0用に書かれました。後のバージョンでもまだほぼ関連性がありますが、いくつかの相違点があります。
4版はLua 5.3を対象としており、Amazonおよび他の書店で購入できます。
本書を購入することにより、Luaプロジェクトをサポートすることもできます。.
![]() |
Programming inLua | ![]() |
パートII.テーブルとオブジェクト Chapter 17.弱いテーブル |
弱いテーブルのもう1つの重要な使い方は、属性をオブジェクトに関連付けることです。オブジェクトに属性をアタッチする必要がある状況は無限に存在します。関数への名前、テーブルへのデフォルト値、配列へのサイズなどです。
オブジェクトがテーブルの場合、適切な一意のキーを使用してテーブル自体に属性を格納できます。前述したように、一意のキーを作成するシンプルでエラーのない方法は、新しいオブジェクト(通常はテーブル)を作成してキーとして使用することです。ただし、オブジェクトがテーブルでない場合、それ自身の属性を維持することはできません。テーブルの場合でも、属性を元のオブジェクトに格納したくない場合があります。たとえば、属性をプライベートに維持したい場合や、属性がテーブルのトラバーサルを妨害しないようにしたい場合などです。これらの場合すべてで、属性をオブジェクトに関連付ける別の方法が必要になります。もちろん、外部テーブルはオブジェクトに属性を関連付けるのに理想的な方法を提供します(テーブルが「連想配列」と呼ばれることがあるのは偶然ではありません)。オブジェクトをキーとして、それらの属性を値として使用します。外部テーブルは、任意のタイプのオブジェクトの属性を保持できます(Luaでは任意のタイプのオブジェクトをキーとして使用できるため)。さらに、外部テーブルに保持されている属性は他のオブジェクトと干渉せず、テーブル自体と同じくらいプライベートにすることができます。
ただし、この一見完璧なソリューションには大きな欠点があります。オブジェクトをテーブルのキーとして使用すると、そのオブジェクトは存在にロックされます。Luaは、キーとして使用されているオブジェクトを収集できません。通常のテーブルを使用して関数をその名前に関連付ける場合、それらの関数は収集されません。予想するとおり、弱いテーブルを使用することでこの欠点を回避できます。ただし、今回は弱いキーが必要です。弱いキーを使用しても、他の参照がなくなるまで、どのキーも収集されることはありません。その一方で、テーブルには弱い値を持つことはできません。そうしないと、ライブオブジェクトの属性が収集される可能性があります。
Lua自体は、この手法を使用して、配列として使用されるテーブルのサイズを維持しています。後で説明するように、テーブルライブラリは配列のサイズを設定する関数とこのサイズを取得する関数を提供します。配列のサイズを設定すると、Luaはこのサイズをプライベートの弱いテーブルに格納します。ここでは、インデックスは配列自体、値はサイズです。
Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |