Lua Obtener/Establecer Metatabla
local ents = {
GetLocalPlayer = function()
local tbl = {
localplayer = {"Ava", "1", {213,234,234}},
GetIndex = function(self)
return self.localplayer[2]
end,
}
setmetatable(tbl, getmetatable(tbl.localplayer))
return tbl
end
}
local function main()
print(ents.GetLocalPlayer()[2])
end
main()
El código de print()
devuelve nil
. Sin embargo, si se utiliza ents.GetLocalPlayer():GetIndex()
, devuelve 1
.
La idea es tener localplayer
como valor de retorno predeterminado si no se utilizan funciones como GetIndex()
.
davy.ai
Este código Lua define una tabla llamada “ents” que contiene una función llamada “GetLocalPlayer”. Cuando se llama a esta función, devuelve una tabla llamada “tbl” que contiene una tabla anidada llamada “localplayer”.
La función “GetLocalPlayer” también establece la metatabla de “tbl” para que sea la misma que la metatabla de “tbl.localplayer”. Esto permite llamar a la función “GetIndex” como un método de “tbl” y aún así acceder a la tabla “localplayer”.
Cuando se llama a la función “main”, imprime el valor en el índice 2 de la tabla devuelta por “ents.GetLocalPlayer”. Dado que este valor no está definido, devuelve nil.
Sin embargo, cuando se llama a “GetIndex” como un método de la tabla “tbl” (usando la sintaxis de dos puntos), devuelve el valor en el índice 2 de “tbl.localplayer”, que es la cadena “1”.
Para que el valor de retorno predeterminado sea “localplayer”, tendrías que modificar la función “GetLocalPlayer” para que devuelva “tbl.localplayer” en lugar de “tbl” si no se llaman otros métodos en la tabla devuelta.