Pregunta

No entiendo la lógica detrás de la decisión de esta parte de Lua. ¿Por qué se inicia la indexación a la 1? He leído (como muchos otros lo hicieron) este gran papel . Me parece una extraña esquina de un lenguaje que es muy agradable para aprender y programa. No me malinterpreten, Lua es simplemente genial, pero tiene que ser una explicación en alguna parte. La mayor parte de lo que he encontrado (en la web) es sólo decir el índice comienza en 1. Punto final.

Sería muy interesante leer lo que dijo que sus diseñadores sobre el tema.

Tenga en cuenta que yo soy "muy" principiante en Lua, espero que no estoy perdiendo algo obvio sobre las tablas.

¿Fue útil?

Solución

Lua es descendiente de Sol, un lenguaje diseñado para ingenieros de petróleo sin entrenamiento formal en la programación de computadoras. Las personas no capacitadas en computación creen que es condenado raro para empezar a contar desde cero. Con la adopción de la matriz y la indexación de cadena de 1 a base de, al Lua diseñadores evitar confundir las expectativas de sus primeros clientes y patrocinadores.

A pesar de que yo también encontré raro al principio, he aprendido a matrices basadas en amor 0. Pero me da por bien con matrices basadas en 1 de Lua, especialmente por usando bucle for genérica de Lua y el ipairs operador por lo general puede evitar preocuparse por cómo se indexan matrices.

Otros consejos

Programación en Lua 's primera discusión de las tablas, se menciona:

Ya que puede indexar una tabla con cualquier valor, puede iniciar los índices de una matriz con cualquier número que te agrada. Sin embargo, es habitual en Lua para iniciar arrays con 1 (y no con 0, como en C) y varias instalaciones se adhieren a esta convención.

Más tarde, en el capítulo sobre las estructuras de datos, dicen casi lo mismo otra vez:. Presuponen que la indexación basada en 1 integrado en las instalaciones de Lua

De todos modos, hay un pareja conveniencias de utilizar la indexación basada en 1. A saber, el # (longitud) del operador: el acceso t[#t] el último (numérico) índice de la tabla, y t[#t+1] accesos 1 pasado el último índice. Para alguien que no haya sido expuesto a la indexación basada en 0, #t+1 sería más intuitiva para desplazarse después del final de una lista. También hay constructo for i = 1,#t de Lua, que creo que entra en la misma categoría que el punto anterior que "1 a la longitud" puede ser más sensible que la indexación "0 a la longitud menos 1".

Sin embargo, si no se puede romper la mentalidad de la indexación basada en 0, entonces la indexación basada en 1 de Lua puede ser sin duda más de un obstáculo. En última instancia, los autores querían algo que funcionó para a ; y voy a admitir que no sé cuál es su ORIGINAL objetivo era, pero es probable que sea cambiado desde entonces.

Hay una razón muy importante de NO contar matrices de 1: Si las matrices comienzan desde cero, puede utilizarlos como anillos algebraicas de una manera natural. P.ej. tenemos los días de la semana (day={'mo', 'tu', 'we'...) y queremos ciclo a través de ellos. Entonces sería mucho menos mindbending a escribir:

nextday = day[(i+1)%7]  as it is in almost every other language

Que:

nextday = day[i%7+1] as it is in lua

no parece ser tan malo al principio, pero trata de ciclo de la semana para otro lado.

o más generalmente: si el conjunto de índices carece de la cero, que carece el elemento neutro de la adición. Siempre que sea necesario en el cálculo del índice, los índices tienen que ser cambiado.

Soy un matemático, pero he aceptado el hecho de que cuando se trata de la programación, a contar desde cero es sólo la mejor opción ..

Mi entendimiento es que es de esa manera sólo porque los autores pensaron que sería una buena manera de hacerlo, y después de que rodó la lengua a la opinión pública que la decisión calcificadas considerablemente. (Sospecho que no habría mucho que pagar eran ellos para cambiar hoy!) Nunca he visto una justificación particular, más allá de eso.

Tal vez un punto menos significativo, pero que no he oído todavía mencionado: hay una mejor simetría en el hecho de que los primeros y últimos caracteres de una cadena están a 1 y -1, respectivamente, en lugar de 0 y -1.

Mesa [0] siempre devuelve nil (nulo), a menos que el valor de asignación para usted mismo tabla [0] = 'un valor' y luego tabla [0] volverá 'un valor' que ha asignado.

Aquí un ejemplo:

tbl={'some'}
print('tbl[0]='..tostring(tbl[0]))
print('tbl[1]='..tostring(tbl[1]))
nothing={}
print('nothing[0]='..tostring(nothing[0]))
print('nothing[1]='..tostring(nothing[1]))
nothing[0]='hey'
print('(after assign)\nnothing[0]='..tostring(nothing[0]))
bibliotecas

Lua prefieren índices de uso que comienzan a 1. Sin embargo, se puede utilizar cualquier índice que desea. Se puede utilizar 0, puede utilizar 1, puede utilizar -5. Es incluso en su manual, que se puede encontrar en ( https://www.lua.org /pil/11.1.html ).

De hecho, algo fresco aquí es lua bibliotecas internas tratar algunos pasaron 0 de 1 como de. Sólo tenga cuidado al utilizar ipairs.
De modo que: ( "abc"): sub (0,1) == "a" y ( "abc"):. Sub (1,1) == "a" será verdadera

 You can start an array at index 0, 1, or any other value:

-- creates an array with indices from -5 to 5
a = {}
for i=-5, 5 do
  a[i] = 0
end

La verdadera razón es que el lenguaje es una implementación de la definición de una ley de Portugal y el principal centro de desarrollo fue en Brasil y su preferencia es evitar el uso de cero o vaciar o nada como un índice o subíndice. Sin embargo, el lenguaje sí permite el uso de un índice de inicio distinto de 1 en la creación de una mesa de función en algunas versiones.

Tiene sentido para cada uno, que si a

table = {}

Por el momento, table está vacía. Por lo tanto, cuando

table == {something}

La tabla contiene algo así que lo que contiene es el índice 1 en table si sabes lo que quiero decir.

Lo que quería decir que su tabla [0] existe, y su tabla = {}, que su vacío, ahora un programador no llamará a una mesa vacía, que los fija, y luego lo llena, será inútil encontrar una mesa vacía cada vez que usted quiera llamarlo, por lo que su más fácil de simplemente crear una mesa vacía.

Mi Inglés no va a mejorar y eso es lo mejor gramática. Si no te gusta ella, su libertad de no seguir leyendo, pero dando -REP para alguien que trata de ayuda hace que la gente no quiere ayudar a todos, especialmente para algo así como la gramática. Soy un hombre de números y VARs, no gramática. Lo sentimos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top