¿Hay una palabra clave const en lua? O cualquier otra cosa similar? Porque quiero definir mis variables como const e impedir el cambio del valor de las variables. Gracias de antemano.¿hay alguna palabra clave como const o cualquier otra cosa que haga el mismo trabajo en lua?
Respuesta
Lua hace no constantes de soporte de forma automática, pero puede agregar esa funcionalidad. Por ejemplo, colocando sus constantes en una tabla y haciendo que la tabla sea de solo lectura usando metatabla.
Aquí es cómo hacerlo: http://andrejs-cainikovs.blogspot.se/2009/05/lua-constants.html
La complicación es que los nombres de sus constantes no serán simplemente "A" y "B", sino algo así como "CONSTANTS.A" y "CONSTANTS.B ". Puede decidir poner todas sus constantes en una tabla, o agruparlas lógicamente en varias tablas; por ejemplo "MATH.E" y "MATH.PI" para constantes matemáticas, etc.
No existe la palabra clave const
en Lua o construcción similar.
La solución más fácil es escribir un gran precaución en un comentario, diciendo que está prohibido escribir en esta variable ...
Sin embargo, es técnicamente posible para prohibir la escritura (o lectura) a un mundial variable proporcionando un metatable al entorno global _G
(o _ENV
en Lua 5.2).
Algo como esto:
local readonly_vars = { foo=1, bar=1, baz=1 }
setmetatable(_G, {__newindex=function(t, k, v)
assert(not readonly_vars[k], 'read only variable!')
rawset(t, k, v)
end})
Entonces, si intenta asignar algo a foo
, se genera un error.
Este código es incorrecto. Protegerá contra el establecimiento de variables NUEVAS, pero no las cambiará. – ZzZombo
Como ya se indicó, no hay const
en Lua.
Se puede utilizar esta solución poco a variables definidas a nivel mundial 'proteger' (en comparación con las tablas protegidas):
local protected = {}
function protect(key, value)
if _G[key] then
protected[key] = _G[key]
_G[key] = nil
else
protected[key] = value
end
end
local meta = {
__index = protected,
__newindex = function(tbl, key, value)
if protected[key] then
error("attempting to overwrite constant " .. tostring(key) .. " to " .. tostring(value), 2)
end
rawset(tbl, key, value)
end
}
setmetatable(_G, meta)
-- sample usage
GLOBAL_A = 10
protect("GLOBAL_A")
GLOBAL_A = 5
print(GLOBAL_A)
- 1. ¿Hay alguna manera de hacer que cualquier cosa de emacs haga búsquedas "difusas"?
- 2. UIApplicationExitsOnSuspende cualquier otra cosa que me falta?
- 3. GWT o DOJO o alguna otra cosa?
- 4. Magma, GOODS, GLORP, o alguna otra cosa?
- 5. ¿Hay alguna palabra clave en Java que sea similar a la palabra clave 'AS' de C#
- 6. Condor, Sun Grid Engine, o alguna otra cosa?
- 7. SortedList indexado por otra cosa que no sea la clave
- 8. ¿Es posible reemplazar una función en php (como correo) y hacer que haga otra cosa?
- 9. ¿Solo ejecuta htmlspecialchars() en la salida o hay alguna otra funcionalidad que también haga?
- 10. ¿Por qué asegurar el trabajo solo en otra cosa?
- 11. C++ const palabra clave: ¿usar liberalmente?
- 12. ¿Hay alguna manera de especificar CUALQUIER COSA como argumento para llamar a NUnit Mocks Expect?
- 13. Objetivo c - cualquier cosa como c?
- 14. ¿Hay algún módulo Perl que me impida agregar `o morir` a cualquier cosa que pueda fallar?
- 15. C: Comportamiento de la palabra clave `const`
- 16. Cómo mover (o hacer cualquier cosa con) el mouse
- 17. ¿Hay alguna manera de iniciar una aplicación WPF sin StartUpUri que no rompa otra cosa?
- 18. ¿Hay una palabra clave throws en C# como en Java?
- 19. ¿Por qué el selector # es de menor especificidad que cualquier otra cosa?
- 20. ejecución de la función de límite de tiempo en PHP o cualquier otra cosa
- 21. innecesaria 'otra cosa' declaración
- 22. Java RegEx que coincide con cualquier cosa PERO cadena literal 'NIL' o 'nil'
- 23. ¿Cuándo System.gc() hace cualquier cosa
- 24. Cómo limpiamente matrices índice numpy con matrices (o cualquier otra cosa que soporta además para que pueda ser compensado)
- 25. Adición palabra clave const a una matriz pasada como parámetro para funcionar
- 26. ¿Hay alguna razón para usar tanto la clave principal como la clave única juntas en el mismo campo?
- 27. ¿Hay generar cualquier orientación por idioma código en Lua con el azúcar rubí-como?
- 28. Php Framework o motor de plantilla u otra cosa?
- 29. ¿Hay algo así como indicadores en Lua?
- 30. ¿Es la palabra clave 'Is' VB.NET lo mismo que Object.ReferenceEquals?
Ver también http://lua-users.org/wiki/ReadOnlyTables. Y tenga en cuenta que puede establecer '_ENV' y/o' _G' en una tabla de solo lectura para simular constantes globales (con algún costo de rendimiento). – finnw
Esto parece una nota muy importante del enlace publicado por @finnw: " Además, este método de creación de tablas de solo lectura ** interfiere con los pares, las ipairs, el siguiente, el operador # y otras formas de iteración de tablas. – chris