この初版は Lua 5.0 向けに執筆されました。後続バージョンでも概ね関連性はありますが、いくつかの相違があります。
第 4 版は Lua 5.3 をターゲットにしていて、Amazon や他の書店で購入できます。
書籍を購入することで、Lua プロジェクトを支援することもできます。
![]() |
Programming inLua | ![]() |
| 第 II 部. テーブルとオブジェクト 第 13 章. メタテーブルとメタメソッド |
プロキシの概念を、読み取り専用テーブルの実装に適用するのは簡単です。必要なことは、テーブルの更新の試みが追跡されたら、常にエラーを発生させることです。__index メタメソッドでは、クエリを追跡する必要がないため、関数ではなくテーブル (元のテーブル自体) を使うことができます。すべてのクエリを元のテーブルにリダイレクトする方が簡単で、効率もずっと高くなります。ただし、この使い方は、__index が元のテーブルを指す新しいメタテーブルを各読み取り専用プロキシに要求します。
function readOnly (t)
local proxy = {}
local mt = { -- create metatable
__index = t,
__newindex = function (t,k,v)
error("attempt to update a read-only table", 2)
end
}
setmetatable(proxy, mt)
return proxy
end
(error への第 2 引数、2 は、更新が試行された場所にエラーメッセージを送信することを忘れないでください。) 使用例として、曜日の読み取り専用テーブルを作成できます。 days = readOnly{"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
print(days[1]) --> Sunday
days[2] = "Noday"
stdin:1: attempt to update a read-only table
| Copyright © 2003–2004 Roberto Ierusalimschy. All rights reserved. | ![]() |