2017-11-03 3 views
4

Ich möchte eine write-once-Tabelle in Lua haben (luajit 2.0.3 speziell), so dass:Write-once-Tabelle in lua?

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

Idealerweise diese sonst wie eine normale Tabelle funktionieren würde (Paare() und ipairs () Arbeit).

__newindex ist im Grunde das Gegenteil von dem, was ich für die einfache Implementierung erreichen möchte, und ich kenne keine Techniken, um ein Proxy-Tabellenmuster mit pairs() und ipairs() arbeiten zu lassen.

Antwort

5

Sie benötigen einen Proxy-Tabelle zu verwenden, die eine leere Tabelle, die alle Zugriff auf die aktuelle Tabelle fängt:

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 

Beachten Sie, dass __pairs und __ipairs nur von Lua arbeiten ab 5.2.

+0

Ich kenne Proxy-Tabellen, aber sie arbeiten * nicht * mit Paaren() oder ipairs(). Ich habe gerade Ihr Code-Snippet ausprobiert und verifiziert, dass pairs() und ipairs() nicht damit arbeiten. – MikeMx7f

+0

@ MikeMx7f, sie tun in Lua 5.2 und 5.3. – lhf

+0

Ich habe Ihr Code-Snippet hier getestet: https://www.lua.org/cgi-bin/demo welches Lua 5.3 verwendet. – MikeMx7f