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.
Réponses:
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
for
boucle générique de Lua et l'ipairs
opérateur - je peux généralement éviter de me soucier de la façon dont les tableaux sont indexés.la source
< length
c'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: SDans la première discussion sur les tables de Programming in Lua , ils mentionnent:
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, ett[#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+1
serait plus intuitif de passer la fin d'une liste. Il y a aussi lafor i = 1,#t
construction 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.
la source
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.
la source
array[0] == array + 0;
, et le comptage basé sur 1 est plus naturel lorsque le tableau est vraiment une table de hachage.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.
la source
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.la source
({'a', 'b'})[1]
évaluer pour'b'
ne pas'a'
cependant? Cela me semble intégré.({[0] = 'a', 'b'})[1]
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.
la source
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:
la source
Il est logique pour chacun que si un
Pour le moment,
table
est vide. Donc quandLa table contient quelque chose donc ce qu'elle contient est l'index 1
table
si 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é.
la source
0
comme 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.