¿Por qué las matrices Lua (tablas) comienzan en 1 en lugar de 0?

125

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.

AraK
fuente
23
El alcance predeterminado también es global. Las dos mayores fallas de Lua.
Yann Ramin
37
No llamaría a partir de 1 una mala característica. En realidad, tiene más sentido: los programadores están tan bien entrenados para pensar en términos de indexación basada en 0 de otros idiomas que no nos gusta. También estamos capacitados para pensar 5/2 = 2. Eso no lo hace correcto.
BlueRaja - Danny Pflughoeft
54
@ BlueRaja-DannyPflughoeft: no. La indexación cero tiene más sentido: los humanos están tan bien entrenados para comenzar a contar con 1 que los idiomas que comienzan con 0 son inicialmente confusos. Pero me encantaría referirlo a Edsger Dijkstra aquí: cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
orlp
11
@ nightcracker: cuando cuentas las manzanas en una mesa, cuentas la primera como "una", la segunda como "dos", etc. Nadie cuenta la primera como "cero" y luego agrega una al final; contar desde cero es simple, indiscutiblemente, contrario a la intuición. Sí, me doy cuenta de que así es como funciona la indexación internamente, pero por eso lo llamamos abstracción.
BlueRaja - Danny Pflughoeft
9
Nunca entendí todo el amor hacia la indexación basada en 0. Es bueno para las compensaciones (¿cuántos elementos omitir desde el principio?) Y subsecuencias (0 ≤ x <n), pero parece incorrecto para las cosas básicas (¿el segundo elemento se llama uno? ¿El décimo elemento corresponde al índice nueve? ¿WAT?) . Incluso los programadores cuentan desde 1 cuando intentan encontrar una línea informada por el compilador ...
marcus

Respuestas:

143

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 forbucle genérico de Lua y el ipairsoperador; por lo general, puedo evitar preocuparme por cómo se indexan las matrices.

Norman Ramsey
fuente
77
Esto es solo una razón histórica de marketing. No hay razón racional, especialmente en el momento actual. Y parece incluso que estamos tratando de evitar la indexación basada en 1 en lugar de utilizarla :)
eonil
27
@Eonil realmente evita la indexación explícita reduce los errores de indexación.
Dan D.
8
Las razones históricas de @Eonil suelen ser las relevantes. Comienzas con algo, y luego nunca puedes cambiarlo, porque rompería todo el código existente. Particularmente malo para la indexación 0 vs. 1, ya que la forma en que se rompe es bastante sutil.
CodesInChaos
55
La diferencia está entre pasar de 1 a Longitud y de 0 a longitud -1, pero en un bucle for < lengthes 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: S
Felype
45

En Programación en la primera discusión de tablas de Lua , mencionan:

Como puede indexar una tabla con cualquier valor, puede comenzar 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 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 y t[#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+1sería más intuitivo pasar el final de una lista. También está la for i = 1,#tconstrucció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.

Mark Rushakoff
fuente
16

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.

dash-tom-bang
fuente
66
Posible justificación: C solo lo hizo porque una matriz es básicamente un puntero y array[0] == array + 0;, y el conteo basado en 1 es más natural cuando la matriz es realmente una tabla hash.
Juez Maygarden,
19
Los índices Lua son en realidad índices. En C cuando dice índice, lo que realmente quiere decir es un desplazamiento.
Alex
8

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.

VXZ
fuente
8
Si bien esto es agradable, que era no la razón para empezar a 1.
LHF
3

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.

 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
usuario2262111
fuente
¿Hay una manera de hacer que ({'a', 'b'})[1]se evalúan como 'b'no 'a', aunque? Eso me parece incorporado.
Remram
1
({[0] = 'a', 'b'})[1]
user2262111
0

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.

Desarrollador
fuente
55
Incluso si esto es cierto, no es en absoluto relevante a cómo se diseñó Lua.
lhf
-1

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:

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]))
BladeMight
fuente
-11

Tiene sentido para todos, que si un

table = {}

Por el momento, tableestá vacío. Así que cuando

table == {something}

La 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.

Wesker
fuente
44
No entiendo el concepto de una tabla con valor 0. Una tabla puede tener una longitud de 0. Pero eso es independiente de la elección del primer índice. No me importan los errores gramaticales menores, pero simplemente no entiendo el punto de su respuesta, por lo que voté en contra.
CodesInChaos
eso es lo que digo, una tabla no se puede mantener con un índice o valor 0, ya que la usamos como una tabla vacía <, <cuando tienes algo, esto es algo representado por 1, "n", así que cuando no tienes nada, estás vacío de algo, que nos lleva a un cero, pero el cero dosificador cuenta, lua es un lenguaje práctico, no sales y les dices a tus amigos que sabes lo que tengo 0 canciones de esos artistas, ya sea que tengas algunas, o tú no el punto de su tabla = {} eso es Cero una mesa vacía
Wesker
55
Una matriz que usa el índice 0como único elemento aún no está vacía. De hecho, lua admite esto, simplemente no es la convención predeterminada.
CodesInChaos
sí, estoy de acuerdo con usted, en algunos otros idiomas, pero no lua, existe un índice de lua 0, así que podemos imaginarlo como un vacío = 0, o así es como lo imagino, incluso cuando puede forzar que el índice sea 0, no funcionará con los valores de la tabla #table no leerá un índice 0, por lo que mi respuesta sigue siendo que lua se hizo básicamente como un evento regular, ahora si pretenden que esto no sea realmente relevante, no volverán a escribir el código de agujero, y no podemos hacer nada al respecto: /, todavía creo que es justo decir que en lua una mesa vacía tiene un índice 0
Wesker