2010-08-07 4 views
11

He leído sobre Lua, es un lenguaje casi perfecto, pero hubo un error crítico. Es una indexación basada en una sola. Leí también que tiene una función para establecer el valor en el índice 0, pero no se cuenta la longitud de la tabla y las manipulaciones de cadena siguen estando basadas en una sola. Entonces la característica no tiene sentido.¿Puedo forzar la indexación de la tabla de Lua desde cero?

No deseo encender basado en uno o basado en cero. Solo estoy preguntando si hay una función que obligue a usar indexación basada en cero.

+1

podría simplemente preguntar por qué es un problema? Ok, entonces prefieres 0-indexación, pero ¿por qué no puedes trabajar con 1 indexación? – gnud

+3

También tengo este problema :) Independientemente de lo que tenga sentido, me equivoco en lua casi todas las veces. ¡Estoy tan acostumbrado a trabajar con otros idiomas que no tienen base en cero que mi código lua está lleno de errores debido a esto solo! – jcoder

+0

no creo que haya alguna bandera que cambie a lua de 1 a 0 y como tal aparte de modificar lua que requiere el uso de un lua no estándar (aquí dob lua0) no veo cómo se haría –

Respuesta

2

Creo que Lua ya tiene la característica que necesita para que esté basada en 0. Lamentablemente, la característica a la que me refiero es la licencia de código abierto de Lua.

No pude encontrar un parche o bifurcación de Lua que haya cambiado la naturaleza basada en 1 del idioma.

Desafortunadamente, hornear Lua para cambiarlo a 0 también rompería la compatibilidad con versiones anteriores. La pérdida de todos los módulos complementarios actuales puede ser un precio demasiado grande para pagar por la facilidad de uso.

+0

Parece que no hay una manera fácil de anular este comportamiento. – Eonil

1

Incluso si hubiera un #define TABLE_START_INDEX 1 en las fuentes de Lua (que no creo que exista), se pegaría un tiro en la pierna al cambiar esto. Esto se debe a que la mayoría de las bibliotecas usan indexación basada en 1. Por lo tanto, cualquier código que haga algo como lo siguiente se romperá.

para i = 1, ... #t hago final

Puede uso de iteradores curso o incluso crear funciones de ayuda para evitar esto.

función get_first (t) de retorno T [1] extremo

Probablemente aunque el problema real que está tratando de resolver es más duro que el cambio de 0 a 1 indexación basada en.

+3

No. No es un problema real. El verdadero problema es que el lenguaje base debe ser el C, que es el lenguaje de indización basado en 0. El intercambio de datos de indexación entre script y host debe traducirse correctamente. Y tengo que manejar el sistema de indexación dual a la vez siempre. – Eonil

3

Sé que esta pregunta ya es de 1 año de edad, pero pensé que los solicitantes futuros estarían interesados ​​en el hecho, que el CFF Explorer contiene un lenguaje de script (LUA con parches), que tiene indexada 0 parche tabla:

http://www.ntcore.com/files/cffscriptv2.htm

Además, en el documento anterior, el autor afirmó que tenía que deshabilitar la mayoría de las funciones de biblioteca estándar, porque son incompatibles con arreglos indexados 0, así que reitere su proceso de pensamiento sobre este tema :)

1

Comentario de Eonil a la respuesta de ponzao: El problema real es que el lenguaje base debe ser el C, que es el lenguaje de indización basado en 0. El intercambio de datos de indexación entre script y host debe traducirse correctamente.

Si desea exponer las estructuras de datos C a Lua, use userdata para empaquetarlas. Puedes hacer que la indexación se comporte como quieras con estas usando metatablas. De esta manera, puede garantizar la traducción correcta.

-1

la respuesta a su pregunta es que no hay manera de forzar todo el proceso que lua maneja con un índice 0, porque hasta ahora sé que #table va de 1, "n" y sin él índice 0 es bastante inútil, a mi parecer, pero depende de lo que quieras hacer, puedes comparar si tienes algo o no, desde a tablas, 1 que lee los productos, 1 que lee los ingresos, y si los productos aumentan tienes más , si los productos son = 1, entonces usted tiene nula, por lo que acaba de leer la tabla 1, en lugar de 2, espero hacer mi auto claro <, <

1

enfoque sucio con algunos inconvenientes:

function zeroIndexed(tbl) 
    local mt = {} 
    mt.data = tbl 
    mt.__index = function(t, k) 
     return mt.data[(type(k) == "number" and k + 1 or k)] 
    end 
    mt.__newindex = function(t, k, v) 
     mt.data[(type(k) == "number" and k + 1 or k)] = v 
    end 
    mt.__len = function() 
     return #mt.data 
    end 
    return setmetatable({}, mt) 
end 
t = zeroIndexed({5, 6, 7}) 
print(t[0], t[1], t[2]) 
t[0] = 4 
print(t[0], #t) 
t[#t] = 8 
print(t[#t - 1], #t) 

Lua 5.2 salidas:

5  6  7 
4  3 
8  4 

En Lua 5.1 #t vuelve 0 porque el __len metamethod no es respetado por las tablas y cuerdas.

Pero recuerde que table.insert y otros métodos de tabla ya no funcionarán aquí porque la inserción se realiza ahora a través del t[#t] = x.

No recomiendo usar esto.

+0

¿por qué no lo recomiendas? para el problema de inserción de tabla? –

+0

Tiene un problema: los iteradores ipairs y pares seguirán arrojando índices para matrices basadas en 1. – val

3

Utilización de matrices 0-indexados en realidad es bastante simple:

local array={ 
[0]="zero", 
    "one", 
    "two" 
} 

for i=0,#array do 
    print(array[i]) 
end 

Puede utilizar #array sin restar 1 porque el operador longitud realidad devuelve el índice más alto (técnicamente, la clave antes del primer cero), no se la "longitud" real (que de todos modos no tendría sentido en Lua).

Para operadores de cadena, es probable que tenga que crear apenas funciones duplicadas (aunque podría haber una mejor manera)

ipairs() también sólo admite 1 de indexación, pero sólo se puede utilizar un habitual for lugar, lo que me encontrar a ser más legible de todos modos:

for _,element in ipairs(array1) do 
    print(element) 
end 
for i=0,#array0 do 
    local element=array0[i] 
    print(element) 
end 
0

puede solucionar este lua-defecto mediante el uso de un iterador que es consciente de las diferentes bases de índice:

function iarray(a) 
    local n = 0 
    local s = #a 
    if a[0] ~= nil then 
    n = -1 
    end 
    return function() 
    n = n + 1 
    if n <= s then return n,a[n] end 
    end 
end 

Sin embargo, todavía se tiene que añadir el elemento cero de forma manual:

Ejemplo de uso:

myArray = {1,2,3,4,5} 
myArray[0] = 0 
for _,e in iarray(myArray) do 
    -- do something with element e 
end 
Cuestiones relacionadas