2017-11-03 12 views
4

ように私は、(特にLuaJIT 2.0.3)のLuaでのライトワンステーブルを持っているしたいと思います:理想的には、これはそうでない場合は((通常のテーブルのようなペア()とipairsを機能するであろうルアの書き込み可能なテーブル?

local tbl = write_once_tbl() 
tbl["a"] = 'foo' 
tbl["b"] = 'bar' 
tbl["a"] = 'baz' -- asserts false 

)仕事)。

__newindexは、これを簡単に実装したいと思っているものと基本的に反対です。プロキシテーブルパターンをペア()とipairs()で作成する方法はわかりません。 __pairs__ipairsのみ以降のLua 5.2から働くこと

function write_once_tbl() 
    local T={} 
    return setmetatable({},{ 
     __index=T, 
     __newindex= 
      function (t,k,v) 
       if T[k]==nil then 
        T[k]=v 
       else 
        error("table is write-once") 
       end 
      end, 
     __pairs= function (t) return pairs(T) end, 
     __ipairs= function (t) return ipairs(T) end, 
     }) 
end 

注:

答えて

5

あなたがあるプロキシ・テーブル、実際のテーブルへのすべてのアクセスをキャッチ空のテーブルを使用する必要があります。

+0

私はプロキシテーブルを知っていますが、pairs()やipairs()では扱いません。私はちょうどあなたのコードスニペットを試してペア()とipairs()がそれで動作しないことを確認しました。 – MikeMx7f

+0

@ MikeMx7f、彼らはルア5.2と5.3で行います。 – lhf

+0

Lua 5.3を使用しているコードスニペットをhttps://www.lua.org/cgi-bin/demoでテストしました。 – MikeMx7f

関連する問題