Soy desarrollador principal para Bitfighter, y estamos usando Lua como lenguaje de scripting para permitir a los jugadores programar sus propias naves de robot personalizadas.Variables de declaración y pregunta de ámbito para Lua
En Lua, no necesita declarar variables, y todas las variables tienen por defecto el alcance global, a menos que se indique lo contrario. Esto lleva a algunos problemas. Tome el siguiente fragmento, por ejemplo:
loc = bot:getLoc()
items = bot:findItems(ShipType) -- Find a Ship
minDist = 999999
found = false
for indx, item in ipairs(items) do
local d = loc:distSquared(item:getLoc())
if(d < minDist) then
closestItem = item
minDist = d
end
end
if(closestItem != nil) then
firingAngle = getFiringSolution(closestItem)
end
En este fragmento, si findItems() devuelve ningún candidato, entonces closestItem habrá todavía se refieren a cualquier buque con el que se encontró la última vez, y en el tiempo intermedio, ese barco podría haber sido asesinado. Si el barco muere, ya no existe y getFiringSolution() fallará.
¿Has detectado el problema? Bueno, tampoco lo harán mis usuarios. Es sutil, pero con un efecto dramático.
Una solución sería exigir que se declaren todas las variables y que todas las variables se definan por defecto en el ámbito local. Si bien ese cambio no haría imposible que los programadores se refirieran a objetos que ya no existen, sería más difícil hacerlo inadvertidamente.
¿Hay alguna manera de decirle a Lua que de forma predeterminada todos los vars alcancen el alcance local, y/o que exijan que se declaren? Sé que algunos otros idiomas (por ejemplo, Perl) tienen esta opción disponible.
Gracias!
¡Muchas buenas respuestas aquí, gracias!
He decidido ir con una versión ligeramente modificada del módulo Lua 'strict'. Esto parece llevarme a donde quiero ir, y lo hackearé un poco para mejorar los mensajes y hacerlos más apropiados para mi contexto particular.
Por cierto, ¿tiene alguna buena razón para poner llaves adicionales dentro de sus declaraciones if? –
Bueno, antes de hacer la pregunta, habría respondido que se requería. ¡Pero ahora tengo que responder que omitir los parens me parece mal! – Watusimoto
Es una preferencia personal, por supuesto. Pero es importante recordar que Lua no es C o Pascal o lo que sea. Lua es Lua y para usarlo efectivamente debes usarlo tal como es, no como si fuera un sustituto pobre para otro lenguaje de programación. Descubrí que esa "sintaxis parece incorrecta" ayuda a poner a Lua en una parte de mi cerebro distinta de C++ y otros idiomas que conozco. En resumen, mi opinión es: si está escrito en Lua, ¡escríbelo a la manera de Lua! :-) –