arrays - tipos - que es un array en programacion
¿Por qué las matrices Lua(tablas) comienzan en 1 en lugar de 0? (9)
No entiendo la razón 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 excelente trabajo . Me parece un rincón extraño de un idioma que es muy agradable de aprender y programar. No me malinterpretes, Lua es genial, pero tiene que haber una explicación en alguna parte. La mayoría de lo que encontré (en la web) es solo decir que el índice comienza en 1. Punto final.
Sería muy interesante leer lo que dijeron sus diseñadores sobre el tema.
Tenga en cuenta que soy "muy" principiante en Lua, espero no perderme algo obvio sobre las tablas.
En Programación en la primera discusión de tablas de Lua , ellos mencionan:
Como puede indexar una tabla con cualquier valor, puede iniciar los índices de una matriz con cualquier número que le agrade. Sin embargo, es habitual en Lua iniciar matrices con 1 (y no con 0, como en C) y varias instalaciones se adhieren a esta convención.
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 conveniencias para usar la indexación basada en 1. A saber, el operador #
(longitud): t[#t]
accede al último índice (numérico) de la tabla, y t[#t+1]
accede a 1 después 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 para moverse más allá del final de una lista. También hay Lua''s for i = 1,#t
construct, que creo que cae en la misma categoría que el punto anterior que "1 a la longitud" puede ser más sensible que indexar "0 a la longitud menos 1".
Pero, si no se 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. En última instancia, los autores querían algo que les funcionara ; y admito que no sé cuál era su objetivo original , pero probablemente haya cambiado desde entonces.
Hay una razón muy importante para NO contar matrices desde 1: si las matrices comienzan desde cero, puede usarlas como anillos algebraicos de forma natural. Por ejemplo, tenemos los días de una semana ( day={''mo'', ''tu'', ''we''...
) y queremos CICLAR a través de ellos. Entonces sería mucho menos mindbending 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 pasar la semana en el otro sentido.
O más en general: si el conjunto de índices carece del cero, carece del elemento neutral de suma. Siempre que sea necesario en los cálculos de índices, los índices deben cambiarse.
Soy un matemático, pero he aceptado el hecho de que cuando se trata de programación, contar desde cero es la mejor opción.
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 un índice o subíndice. Sin embargo, el lenguaje no permite el uso de un índice de inicio distinto de 1 en una función de creación de tabla en algunas versiones.
Las bibliotecas de 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. Está incluso 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 a ALGUNOS de los 0 pasados como 1. Solo tenga cuidado al usar ipairs.
De modo que: ("abc"): sub (0,1) == "a" y ("abc"): sub (1,1) == "a" será verdadero.
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
Lua desciende de Sol, un lenguaje diseñado para ingenieros petroleros sin entrenamiento formal en programación de computadoras. Las personas que no están capacitadas en computación piensan que es condenadamente extraño comenzar a contar a 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é raros al principio, aprendí a amar las matrices basadas en 0. Pero estoy de acuerdo con las matrices basadas en 1 de Lua, especialmente al utilizar el bucle for
del operador genérico de Lua y el operador de ipairs
; por lo general, puedo evitar preocuparme por cómo se indexan las matrices.
Quizás un punto menos significativo, pero que aún no he escuchado mencionar: hay una mejor simetría en el hecho de que el primer y el último caracteres de una cadena están en 1 y -1 respectivamente, en lugar de 0 y -1.
Tengo entendido que es así solo porque los autores pensaron que sería una buena manera de hacerlo, y después de que lanzaron el lenguaje al público, esa decisión se calificó considerablemente. (¡Sospecho que habría un infierno para pagar si lo cambiaran hoy!) Nunca he visto una justificación particular más allá de eso.
Tiene sentido para todos, que si
table = {}
Por el momento, la table
está vacía. Así que cuando
table == {something}
La tabla contiene algo, por lo que lo que contiene es el índice 1 en la table
si sabes a qué me refiero.
Lo que quiero decir es que la tabla [0] existe, y su tabla = {}, que está vacía, ahora un programador no llamará a una tabla vacía, los establece, y luego lo llena, será inútil encontrar un vacío tabla cada vez que desee llamarlo, por lo que es más fácil crear una tabla vacía.
Mi inglés no mejorará y esa es mi mejor gramática. Si no te gusta, no dudes en no seguir leyéndolo, pero dar -rep para 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 vars, no de gramática. Lo siento.
table [0] SIEMPRE devolverá nil (nulo), A MENOS que le asigne valor a la tabla [0] = ''algún valor'' y luego la tabla [0] devolverá ''algún valor'' que USTED asignó.
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]))