2014-09-08 8 views
5

Wie ändert man den Längenoperator (#) für eine Tabelle in Lua, das Handbuch schlägt vor, die __len Funktion in einem Metatable zuweisen und dann das Metatable der Tabelle zuweisen, die ich überschreiben möchte, aber Das funktioniert nicht wie erwartet? Ich habe keine Möglichkeit, dies auf der C-Seite zu überschreiben.Lua Tabellenlänge Funktion Override funktioniert nicht

turtles = {1,2,3} 
setmetatable(turtles, {__len = function(mytable) return 5 end}) 

print(#turtles) 
--returns 3, should return 5 
+0

möglich Duplikat [Lua Überschreibung # für Strings] (http://stackoverflow.com/questions/23085204/lua-override-for-strings) –

+0

@LarryBattle Nicht wirklich ein Duplikat, hier der Operand ist keine Zeichenfolge, sondern eine Tabelle. –

+0

Ihr Code funktioniert gut in der [Lua Live-Demo] (http://www.lua.org/demo.html). – lhf

Antwort

6

Sie müssen Lua 5.1 verwenden. Die Metamethode __len auf Tabellen wird seit Lua 5.2 unterstützt.

In Lua 5.1 reference manual, wenn der Operand eine Tabelle ist, geben Sie die primitive Tabellenlänge direkt zurück.

"len": die # Operation.

function len_event (op) 
    if type(op) == "string" then 
    return strlen(op)   -- primitive string length 
    elseif type(op) == "table" then 
    return #op    -- primitive table length 
    else 
    local h = metatable(op).__len 
    if h then 
     -- call the handler with the operand 
     return (h(op)) 
    else -- no handler available: default behavior 
     error(···) 
    end 
    end 
end 

In Lua 5.2 reference manual, wenn der Operand eine Tabelle ist, ob der __len metamethod zur Verfügung steht.

"len": die # Operation.