2013-10-13 6 views
5

Cerco una libreria/funzione nel lua che permette di avere tipi di variabili personalizzati (anche essere rilevati come tipo personalizzato utilizzando il metodo del "tipo"). Sto cercando di creare un codificatore/decodificatore json con il tipo personalizzato "json". Voglio una soluzione che possa essere fatta solo in lua.Tipi personalizzati variabili Lua

risposta

9

Non è possibile creare nuovi tipi di Lua, ma si può mimare la loro creazione in buona misura utilizzando metatables e tabelle. Ad esempio:

local frobnicator_metatable = {} 
frobnicator_metatable.__index = frobnicator_metatable 

function frobnicator_metatable.ToString(self) 
    return "Frobnicator object\n" 
     .. " field1 = " .. tostring(self.field1) .. "\n" 
     .. " field2 = " .. tostring(self.field2) 
end 


local function NewFrobnicator(arg1, arg2) 
    local obj = { field1 = arg1, field2 = arg2 } 
    return setmetatable(obj, frobnicator_metatable) 
end 

local original_type = type -- saves `type` function 
-- monkey patch type function 
type = function(obj) 
    local otype = original_type(obj) 
    if otype == "table" and getmetatable(obj) == frobnicator_metatable then 
     return "frobnicator" 
    end 
    return otype 
end 

local x = NewFrobnicator() 
local y = NewFrobnicator(1, "hello") 

print(x) 
print(y) 
print("----") 
print("The type of x is: " .. type(x)) 
print("The type of y is: " .. type(y)) 
print("----") 
print(x:ToString()) 
print(y:ToString()) 
print("----") 
print(type("hello!")) -- just to see it works as usual 
print(type({})) -- just to see it works as usual 

uscita:

 
table: 004649D0 
table: 004649F8 
---- 
The type of x is: frobnicator 
The type of y is: frobnicator 
---- 
Frobnicator object 
    field1 = nil 
    field2 = nil 
Frobnicator object 
    field1 = 1 
    field2 = hello 
---- 
string 
table 

Naturalmente l'esempio è semplicistico e ci sono più cose da dire programmazione ad oggetti in Lua. È possibile trovare i seguenti riferimenti utili:

+0

Per la vostra funzione di tipo() qui, quello che faccio di solito è implementare un campo __type nel metatabella che descrive il nome di classe. Quindi digitare sarà sempre un valore utile per tutte le classi. – Zeksie

+0

@ Zeksie Sì, è sicuramente un'opzione. Come ho detto, c'è molto altro da dire su OOP a Lua. –

+0

Potresti creare una funzione che renderebbe un tipo di variabile personalizzato? Ad esempio: 'jsonCode = {" json text here "} varType (jsonCode," json ")' restituirebbe semplicemente 'jsonCode' con il tipo personalizzato' "json" '. 'tostring (jsonCode)' restituirebbe 'jsonCode [1]' (che, in questo caso, sarebbe uguale a '" json text here "). Non preoccuparti di implementare il sistema a 2 valori che hai qui, lo userò solo con la tabella che ha 1 valore. – tupperkion

5

Quello che stai chiedendo non è possibile, nemmeno con l'API C. Semplicemente ci sono solo i tipi predefiniti in Lua, non c'è modo di aggiungerne altri. Tuttavia, utilizzando metamethods e tavoli si possono creare (funzioni che creano tabelle) che vengono molto vicino ai tipi personalizzati/classi in altre lingue. Vedi ad esempio Programming in Lua: Object-Oriented Programming (ma tieni presente che il libro è stato scritto per Lua 5.0, quindi alcuni dettagli potrebbero essere cambiati).