No entiendo la lógica detrás de la decisión de esta parte de Lua. ¿Por qué la indexación comienza en 1? He leído (como muchos otros) este gran artículo . Me parece un rincón extraño de un idioma que es muy agradable de aprender y programar. No me malinterpreten, Lua es simplemente genial, pero tiene que haber una explicación en alguna parte. La mayor parte de lo que encontré (en la web) solo dice que el índice comienza en 1. Punto final.
Sería muy interesante leer lo que sus diseñadores dijeron sobre el tema.
Tenga en cuenta que soy "muy" principiante en Lua, espero que no me falte algo obvio sobre las tablas.
Respuestas:
Lua es descendiente de Sol, un lenguaje diseñado para ingenieros petroleros sin capacitación formal en programación de computadoras. Las personas no entrenadas en computación piensan que es muy extraño comenzar a contar desde cero. Al adoptar la matriz basada en 1 y la indexación de cadenas, los diseñadores de Lua evitaron confundir las expectativas de sus primeros clientes y patrocinadores.
Aunque también los encontré extraños al principio, aprendí a amar las matrices basadas en 0. Pero me llevo bien con las matrices basadas en 1 de Lua, especialmente al usar el
for
bucle genérico de Lua y elipairs
operador; por lo general, puedo evitar preocuparme por cómo se indexan las matrices.fuente
< length
es mucho más útil y fácil de leer en los "lenguajes basados en 0 raros". Confieso que cuando veo un bucle iterando desde 1, inmediatamente asumo que comienza desde el segundo elemento: SEn Programación en la primera discusión de tablas de Lua , mencionan:
Más adelante, en el capítulo sobre estructuras de datos, dicen casi lo mismo otra vez: que las instalaciones integradas de Lua asumen una indexación basada en 1.
De todos modos, hay un par de comodidades para usar la indexación basada en 1. A saber, el
#
operador (longitud):t[#t]
accede al último índice (numérico) de la tabla yt[#t+1]
accede a 1 más allá del último índice. Para alguien que aún no ha estado expuesto a la indexación basada en 0,#t+1
sería más intuitivo pasar el final de una lista. También está lafor i = 1,#t
construcción de Lua , que creo que pertenece a la misma categoría que el punto anterior de que "1 a la longitud" puede ser más sensible que indexar "0 a la longitud menos 1".Pero, si no puede romper la mentalidad de la indexación basada en 0, entonces la indexación basada en 1 de Lua ciertamente puede ser más un obstáculo. Finalmente, los autores querían algo que les funcionara ; y admito que no sé cuál era su objetivo original , pero probablemente ha cambiado desde entonces.
fuente
Tengo entendido que es así solo porque los autores pensaron que sería una buena manera de hacerlo, y después de lanzar el lenguaje al público, esa decisión se calmó considerablemente. (¡Sospecho que habría que pagar un infierno si lo cambiaran hoy!) Nunca he visto una justificación particular más allá de eso.
fuente
array[0] == array + 0;
, y el conteo basado en 1 es más natural cuando la matriz es realmente una tabla hash.Quizás un punto menos significativo, pero aún no he escuchado mencionar: hay una mejor simetría en el hecho de que el primer y el último carácter de una cadena están en 1 y -1 respectivamente, en lugar de 0 y -1.
fuente
Las bibliotecas Lua prefieren usar índices que comienzan en 1. Sin embargo, puede usar cualquier índice que desee. Puede usar 0, puede usar 1, puede usar -5. Incluso está en su manual, que se puede encontrar en ( https://www.lua.org/pil/11.1.html ).
De hecho, algo genial aquí es que las bibliotecas internas de lua tratarán ALGUNOS 0 aprobados como 1. Solo tenga cuidado al usar ipairs.
Entonces eso:
("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"
será cierto.fuente
({'a', 'b'})[1]
se evalúan como'b'
no'a'
, aunque? Eso me parece incorporado.({[0] = 'a', 'b'})[1]
La verdadera razón es que el lenguaje es una implementación de la definición en una ley de Portugal y el principal centro de desarrollo estaba en Brasil y su preferencia es evitar el uso de cero o vacío o nada como índice o subíndice. Sin embargo, el lenguaje sí permite el uso de un índice de inicio distinto de 1 en una función de creación de tablas en algunas versiones.
fuente
la tabla [0] SIEMPRE devolverá nulo (nulo), A MENOS que usted le asigne un valor usted mismo tabla [0] = 'algún valor' y luego la tabla [0] devolverá 'algún valor' que USTED asignó.
Aquí un ejemplo:
fuente
Tiene sentido para todos, que si un
Por el momento,
table
está vacío. Así que cuandoLa tabla contiene algo, así que lo que contiene es el índice 1 en
table
si sabes a qué me refiero.Lo que quise decir es que esa tabla [0] existe, y su tabla = {}, que está vacía, ahora un programador no llamará a una tabla vacía, las establece, y luego la llena, será inútil encontrar una vacía tabla cada vez que quiera llamarlo, por lo que es más simple crear una tabla vacía.
Mi inglés no mejorará y esa es mi mejor gramática. Si no te gusta, eres libre de no seguir leyéndolo, pero dar una respuesta a alguien que intenta ayudar hace que la gente no quiera ayudar en absoluto, especialmente para algo como la gramática. Soy un hombre de números y variables, no de gramática. Lo siento.
fuente
0
como único elemento aún no está vacía. De hecho, lua admite esto, simplemente no es la convención predeterminada.