Pourquoi les tableaux (tables) Lua commencent-ils à 1 au lieu de 0?

125

Je ne comprends pas le raisonnement derrière la décision de cette partie de Lua. Pourquoi l'indexation commence-t-elle à 1? J'ai lu (comme beaucoup d'autres) cet excellent article . Cela me semble un coin étrange d'une langue très agréable à apprendre et à programmer. Ne vous méprenez pas, Lua est tout simplement géniale mais il doit y avoir une explication quelque part. La plupart de ce que j'ai trouvé (sur le Web) dit simplement que l'index commence à 1. Point final.

Il serait très intéressant de lire ce que ses concepteurs ont dit sur le sujet.

Notez que je suis "très" débutant en Lua, j'espère ne pas manquer quelque chose d'évident sur les tables.

AraK
la source
23
La portée par défaut est également globale. Les deux plus gros défauts de Lua.
Yann Ramin
37
Je n'appellerais pas à partir de 1 un dysfonctionnement. Cela a en fait plus de sens - les programmeurs sont tellement bien formés pour penser en termes d'indexation basée sur 0 à partir d'autres langages que nous ne l'aimons pas. Nous sommes également formés pour penser 5/2 = 2. Cela ne règle pas les choses.
BlueRaja - Danny Pflughoeft
54
@ BlueRaja-DannyPflughoeft: non. L'indexation zéro a plus de sens - les humains sont tellement bien entraînés à commencer à compter avec 1 que les langues commençant par 0 sont initialement déroutantes. Mais je serais ravi de vous référer à Edsger Dijkstra ici: cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF
orlp
11
@nightcracker: Lorsque vous comptez des pommes sur une table, vous comptez la première comme "une", la seconde comme "deux", etc. Personne ne compte la première comme "zéro" puis en ajoute une à la fin; compter à partir de zéro est tout simplement, incontestablement, contre-intuitif. Oui, je réalise que c'est ainsi que l'indexation fonctionne en interne, mais c'est pourquoi nous l'appelons une abstraction.
BlueRaja - Danny Pflughoeft
9
Je n'ai jamais compris tout l'amour pour l'indexation basée sur 0. C'est bien pour les décalages (combien d'éléments à sauter depuis le début?) Et les sous-séquences (0 ≤ x <n), mais cela ne va pas pour les choses de base (le deuxième élément s'appelle un? Le dixième élément correspond à l'index neuf? WAT?) . Même les programmeurs comptent à partir de 1 lorsqu'ils essaient de trouver une ligne rapportée par le compilateur ...
marcus

Réponses:

143

Lua est un descendant de Sol, un langage conçu pour les ingénieurs pétroliers sans formation formelle en programmation informatique. Les gens qui ne sont pas formés à l'informatique pensent que c'est vraiment bizarre de commencer à compter à zéro. En adoptant l'indexation de tableau et de chaîne basée sur 1, les concepteurs de Lua ont évité de confondre les attentes de leurs premiers clients et sponsors.

Bien que je les trouve aussi bizarres au début, j'ai appris à aimer les tableaux basés sur 0. Mais je me débrouille bien avec les tableaux basés sur 1 de Lua, en particulier en utilisant la forboucle générique de Lua et l' ipairsopérateur - je peux généralement éviter de me soucier de la façon dont les tableaux sont indexés.

Norman Ramsey
la source
7
C'est juste une raison historique et marketing. Aucune raison rationnelle, surtout à l'heure actuelle. Et il semble même que vous essayez d'éviter l'indexation basée sur 1 au lieu de l'utiliser :)
eonil
27
@Eonil en évitant l'indexation explicite réduit les erreurs d'indexation.
Dan D.
8
Les raisons historiques @Eonil sont généralement les plus pertinentes. Vous commencez par quelque chose, puis vous ne pouvez jamais le changer, car cela briserait tout le code existant. Particulièrement mauvais pour l'indexation 0 contre 1, car la façon dont elle se brise est assez subtile.
CodesInChaos
5
La différence est entre passer de 1 à Length et de 0 à length -1, mais dans une boucle for, < lengthc'est beaucoup plus pratique et plus facile à lire sur les "langages à base 0 bizarres". J'avoue que quand je vois une boucle itérer à partir de 1, je suppose immédiatement qu'elle commence à partir du 2ème élément: S
Felype
45

Dans la première discussion sur les tables de Programming in Lua , ils mentionnent:

Puisque vous pouvez indexer une table avec n'importe quelle valeur, vous pouvez démarrer les index d'un tableau avec n'importe quel nombre qui vous plaît. Cependant, il est habituel dans Lua de démarrer les tableaux avec 1 (et non avec 0, comme en C) et plusieurs fonctionnalités respectent cette convention.

Plus tard, dans le chapitre sur les structures de données, ils répètent à peu près la même chose: que les fonctionnalités intégrées de Lua supposent une indexation basée sur 1.

Quoi qu'il en soit, il existe quelques avantages à utiliser l'indexation basée sur 1. À savoir, l' #opérateur (longueur): t[#t]accède au dernier index (numérique) de la table, et t[#t+1]accède à 1 après le dernier index. Pour quelqu'un qui n'a pas déjà été exposé à l'indexation basée sur 0, il #t+1serait plus intuitif de passer la fin d'une liste. Il y a aussi la for i = 1,#tconstruction de Lua , qui, je crois, relève de la même catégorie que le point précédent selon lequel "1 à la longueur" peut être plus judicieux que l'indexation "0 à la longueur moins 1".

Mais, si vous ne pouvez pas briser l'état d'esprit de l'indexation basée sur 0, alors l'indexation basée sur 1 de Lua peut certainement être plus un obstacle. En fin de compte, les auteurs voulaient quelque chose qui fonctionnait pour eux ; et j'avoue que je ne sais pas quel était leur objectif initial , mais il a probablement changé depuis.

Mark Rushakoff
la source
16

Je crois comprendre que c'est ainsi simplement parce que les auteurs pensaient que ce serait une bonne façon de le faire, et après avoir diffusé le libellé au public, cette décision s'est considérablement calcifiée. (Je soupçonne qu'il y aurait un enfer à payer s'ils le changeaient aujourd'hui!) Je n'ai jamais vu une justification particulière au-delà de cela.

dash-tom-bang
la source
6
Justification possible: C ne l'a fait que parce qu'un tableau est fondamentalement juste un pointeur et array[0] == array + 0;, et le comptage basé sur 1 est plus naturel lorsque le tableau est vraiment une table de hachage.
Juge Maygarden
19
Les indices Lua sont en fait des indices. En C, lorsque vous dites index, ce que vous voulez vraiment dire est un décalage.
Alex
8

Peut-être un point moins significatif, mais dont je n'ai pas encore entendu parler: il y a une meilleure symétrie dans le fait que le premier et le dernier caractère d'une chaîne sont respectivement à 1 et -1, au lieu de 0 et -1.

VXZ
la source
8
Bien que ce soit bien, ce n'était pas la raison de commencer à 1.
lhf
3

Les bibliothèques Lua préfèrent utiliser des index qui commencent à 1. Cependant, vous pouvez utiliser n'importe quel index de votre choix. Vous pouvez utiliser 0, vous pouvez utiliser 1, vous pouvez utiliser -5. C'est même dans leur manuel, qui peut être trouvé à ( https://www.lua.org/pil/11.1.html ).

En fait, quelque chose de cool ici est que les bibliothèques lua internes traiteront CERTAINS 0 passés comme des 1. Soyez prudent lorsque vous utilisez ipairs.
Alors ça: ("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"sera vrai.

 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
user2262111
la source
Y a-t-il un moyen de faire ({'a', 'b'})[1]évaluer pour 'b'ne pas 'a'cependant? Cela me semble intégré.
remram
1
({[0] = 'a', 'b'})[1]
user2262111
0

La vraie raison est que la langue est une mise en œuvre de la définition dans une loi du Portugal et que le principal centre de développement était au Brésil et leur préférence est d'éviter l'utilisation de zéro ou vide ou rien comme index ou indice. Cependant, le langage autorise l'utilisation d'un index de démarrage autre que 1 dans une fonction de création de table dans certaines versions.

Développeur
la source
5
Même si cela est vrai, cela n'a aucun rapport avec la conception de Lua.
lhf
-1

table [0] renverra TOUJOURS nil (nul), À MOINS que vous ne lui attribuiez une valeur vous-même table [0] = 'some value' et la table [0] renverra 'une valeur' ​​que VOUS avez assignée.

Voici un exemple:

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
la source
-11

Il est logique pour chacun que si un

table = {}

Pour le moment, tableest vide. Donc quand

table == {something}

La table contient quelque chose donc ce qu'elle contient est l'index 1 tablesi vous voyez ce que je veux dire.

Ce que je voulais dire, c'est que la table [0] existe, et sa table = {}, qui est vide, maintenant un programmeur n'appellera pas une table vide, il les définit, puis la remplit, il sera inutile de trouver une table vide table à chaque fois que vous voulez l'appeler, il est donc plus simple de créer simplement une table vide.

Mon anglais ne s'améliorera pas et c'est ma meilleure grammaire. Si vous ne l'aimez pas, vous êtes libre de ne pas continuer à le lire, mais donner -rep pour quelqu'un qui essaie d'aider fait que les gens ne veulent pas du tout aider, surtout pour quelque chose comme la grammaire. Je suis un homme de nombres et de vars, pas de grammaire. Désolé.

Wesker
la source
4
Je ne comprends pas le concept d'une table valant 0. Une table peut avoir une longueur de 0. Mais c'est indépendant du choix du premier index. Je ne me soucie pas des erreurs de grammaire mineures, mais je ne comprends tout simplement pas le point de votre réponse, c'est pourquoi j'ai décliné.
CodesInChaos du
thats what i ment, a table can be hold with a 0 index or value, since we use it as an empty table <, <quand vous avez quelque chose ce quelque chose est représenté à partir de 1, "n" donc quand vous n'avez rien, votre vide de quelque chose, qui nous mène à un cero, mais le cero dosnt compte, c'est un langage pratique, vous ne sortez pas et dites à vos amis que vous savez ce que j'ai 0 chansons de ces artistes, eigther vous en avez, ou vous ne pas. the point its table = {} thats cero an empty table
Wesker
5
Un tableau qui utilise l'index 0comme seul élément n'est toujours pas vide. En fait, lua prend en charge cela, ce n'est tout simplement pas la convention par défaut.
CodesInChaos
oui, je suis d'accord avec vous, sur d'autres langues, mais pas lua, lua index 0 dosnt existe, donc nous pouvons l'imaginer comme un vide = 0, ou c'est comme ça que je l'imagine, même si vous pouvez forcer l'index à 0, il ne fonctionnera pas avec les valeurs de table #table ne lira pas un index 0, donc ma réponse est toujours que lua est fondamentalement fait comme un événement régulier, maintenant s'ils le souhaitent ou non, ce n'est pas vraiment pertinent, vous n'écrirez plus le code du trou, et nous ne pouvons rien y faire: /, je crois toujours qu'il est juste de dire que dans lua une table vide a un indice 0
Wesker