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
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:
- Lua WIKI OOP index page.
- Lua WIKI page: Object Orientation Tutorial.
- Chapter on OOP of Programming in Lua. È la prima edizione di un libro, quindi è focalizzata su Lua 5.0, ma il materiale di base è ancora valido.
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).
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
@ Zeksie Sì, è sicuramente un'opzione. Come ho detto, c'è molto altro da dire su OOP a Lua. –
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