この初版は 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. | ![]() |