弱いキーと弱い値
__mode='k'、'v'、'kv'でキャッシュのような構造向けの弱いテーブルを作成します。
「弱いキーと弱い値」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
弱テーブルとは
弱テーブルは、ガベージコレクションを妨げない参照を保持します。弱テーブル内のオブジェクトは、テーブルが存在していても回収されることがあります。
__modeメタメソッド
メタテーブルに __mode を設定して、弱参照の対象を制御します。"k" は弱いキー、"v" は弱い値、"kv" はその両方を表します。
local weakValues = setmetatable({}, {__mode = "v"})
local weakKeys = setmetatable({}, {__mode = "k"})弱い値の例
他の参照が存在しなくなると、値が回収されるキャッシュです。
local cache = setmetatable({}, {__mode = "v"})
local function getObject(key)
if not cache[key] then
cache[key] = {data = key} -- expensive to create
end
return cache[key]
endGC後に弱い値が消える
オブジェクトへの参照が弱い値のテーブルにしか存在しなくなると、GCがそのオブジェクトを回収し、エントリも消えます。
local t = setmetatable({}, {__mode = "v"})
do
local obj = {}
t[1] = obj
print(t[1]) -- table: 0x...
end
collectgarbage()
print(t[1]) -- nil (collected)弱いキーの例
弱いキーを使うと、オブジェクトの回収を妨げずにメタデータを関連付けられます。キーのオブジェクトが回収されると、エントリも削除されます。
local meta = setmetatable({}, {__mode = "k"})
local function attachMeta(obj, data)
meta[obj] = data
endオブジェクトアノテーションパターン
弱いキーのテーブルを使って、オブジェクトに追加データを付加します。オブジェクトがGCによって回収されると、アノテーションも自動的に削除されます。
local annotations = setmetatable({}, {__mode = "k"})
annotations[myObj] = {created = os.time(), owner = "Alice"}
print(annotations[myObj].owner)弱いキーと値のテーブル
"kv" テーブルには、弱いキーと弱い値の両方が設定されます。他の場所から参照されている生存中のキーだけが、エントリを保持します。
エフェメロンテーブル
Lua 5.2以降では、弱いキーのテーブルはエフェメロンです。値への唯一の参照がキーを介したものなら、キーと値は一緒に回収されます。これにより、予期しない保持を防げます。
弱い値を使ったキャッシュパターン
代表的な用途はメモ化キャッシュです。メモリが必要になると、手動で削除しなくてもキャッシュ済みの結果を解放できます。
local function weakMemo(fn)
local cache = setmetatable({}, {__mode = "v"})
return function(x)
if not cache[x] then cache[x] = fn(x) end
return cache[x]
end
end制限
弱テーブルでは、数値、ブール値、文字列などのプリミティブ型を弱い値として保持できません。これらはGCで回収できないためです(文字列はインターンされます)。
弱テーブルを使う場面
- メモリ負荷が高まったときにメモリを解放したいオブジェクトキャッシュ。
- 外部オブジェクトへのメタデータの関連付け。
- カスタムオブジェクト用のインターンテーブルの実装。
弱テーブルの問題
メタテーブルの __mode = "v" は何をしますか。
まとめ:弱いキーと値
弱テーブルでは、__mode = "k"、"v"、"kv" を使って、キーや値をGCで回収できるようにします。これは、メモリを安全に管理するキャッシュや、オブジェクトアノテーションパターンに不可欠です。
よくある質問
「弱いキーと弱い値」レッスンは無料ですか?
はい。「弱いキーと弱い値」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「弱いキーと弱い値」で何を学びますか?
__mode='k'、'v'、'kv'でキャッシュのような構造向けの弱いテーブルを作成します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「弱いキーと弱い値」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。