Question

Je ne comprends pas la raison d'être de la décision de cette partie de Lua. Pourquoi l'indexation commence à 1? J'ai lu (comme beaucoup d'autres l'ont fait) ce grand papier . Il me semble un coin étrange d'une langue qui est très agréable d'apprendre et de programme. Ne vous méprenez pas, Lua est tout simplement génial, mais il doit y avoir quelque part une explication. La plupart de ce que j'ai trouvé (sur le web) est en train de dire l'indice commence à 1. Arrêt complet.

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 dans Lua, je l'espère, je ne manque pas une chose évidente sur les tables.

Était-ce utile?

La solution

Lua est descendu de Sol, un langage conçu pour les ingénieurs pétroliers sans formation en programmation informatique. Les gens ne sont pas formés dans le calcul pensent qu'il est sacrément bizarre de commencer à compter à zéro. En adoptant tableau 1 base et l'indexation des chaînes, le Lua DESIGNERS évité confondant les attentes de leurs premiers clients et sponsors.

Bien que je les trouvais trop bizarre au début, je l'ai appris à des tableaux basés sur 0 amour. Mais je reçois par OK avec des tableaux à base 1-Lua, en particulier par en utilisant la boucle de for générique de Lua et l'opérateur-je ipairs peut généralement éviter se soucier de combien les tableaux sont indexés.

Autres conseils

Programmation dans Lua de la première discussion »des tableaux, ils mentionnent:

  

Comme vous pouvez indexer une table avec une valeur, vous pouvez commencer les indices d'un tableau avec un nombre quelconque qui vous plaît. Cependant, il est d'usage en Lua pour commencer des tableaux avec 1 (et non 0, comme en C) et plusieurs installations en tenir à cette convention.

Plus tard, dans le chapitre sur les structures de données, ils disent à peu près la même chose à nouveau. Que les installations intégrées de Lua indexation assumerait la base 1

Quoi qu'il en soit, il y a deux commodités à l'aide de l'indexation de base 1. A savoir, l'opérateur # (longueur): accès t[#t] le dernier index (numérique) de la table, et les accès t[#t+1] 1 passé le dernier indice. Pour quelqu'un qui n'a pas déjà été exposés à l'indexation basée 0, #t+1 serait plus intuitive pour aller au-delà de la fin d'une liste. Il y a aussi la construction de for i = 1,#t de Lua, que je crois relève de la même catégorie que le point précédent que « 1 à la longueur » peut être plus sensible que l'indexation « 0 à la longueur moins 1 ».

Mais, si vous ne pouvez pas briser la mentalité de l'indexation basé sur 0, puis l'indexation de base 1 Lua peut certainement être plus un obstacle. En fin de compte, les auteurs voulaient quelque chose qui a travaillé pour les ; et je dois admettre que je ne sais pas ce que leur d'origine but était, mais il est probablement changé depuis.

Il y a une raison très important de ne pas compter les tableaux de 1: Si les tableaux commencent à partir de zéro, vous pouvez les utiliser comme des anneaux algébriques d'une manière naturelle. Par exemple. nous avons les jours de la semaine (day={'mo', 'tu', 'we'...) et nous voulons CYCLE à travers eux. Ensuite, il serait beaucoup moins mindbending à écrire:

nextday = day[(i+1)%7]  as it is in almost every other language

Que:

nextday = day[i%7+1] as it is in lua

ne semble pas être si mauvais au début, mais essayer de cycle de la semaine dans l'autre sens.

Ou plus généralement: si l'ensemble de l'indice n'a pas le zéro, il manque l'élément neutre de l'addition. Chaque fois qu'il est nécessaire dans le calcul des indices, les indices doivent être décalés.

Je suis un mathématicien, mais je l'ai accepté le fait que quand il s'agit de la programmation, le comptage de zéro est juste la meilleure option ..

Si je comprends bien que c'est de cette façon simplement parce que les auteurs ont pensé que ce serait une bonne façon de le faire, et après avoir roulé la langue au public cette décision calcifiées considérablement. (Je soupçonne qu'il y aurait l'enfer à payer étaient-ils pour changer aujourd'hui!) Je ne l'ai jamais vu une justification particulière au-delà.

Peut-être un point moins important, mais je ne l'ai pas entendu encore mentionné: il y a une meilleure symétrie dans le fait que les premiers et derniers caractères dans une chaîne sont à 1 et -1 respectivement, au lieu de 0 et -1.

Tableau [0] TOUJOURS return nil (null), à moins que vous valeur Assigner à vous-même table [0] = 'une valeur' ??et table [0] retournera 'une certaine valeur' ??que vous avez attribué.

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]))

bibliothèques Lua préfèrent les indices d'utilisation qui commencent à 1. Toutefois, vous pouvez utiliser l'index que vous voulez. Vous pouvez utiliser 0, vous pouvez utiliser 1, vous pouvez utiliser -5. Il est même dans leur manuel, qui se trouve à ( https://www.lua.org /pil/11.1.html ).

En fait, quelque chose de cool ici est de bibliothèques lua internes traiter certains passaient des 0 comme des 1. Il suffit de faire preuve de prudence lors de l'utilisation ipairs.
Alors que: ( "abc"): sous (0,1) == "a" et ( "abc"). Sous (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

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

Il est logique de tout le monde, que si un

table = {}

À l'heure actuelle, table est vide. Donc, quand

table == {something}

Le tableau contient quelque chose de si ce qu'il contient est l'indice 1 table si vous savez ce que je veux dire.

Ce que je voulais dire son tableau que [0] existe, et sa table = {}, que son vide, maintenant un programmeur ne remet pas une table vide, il les met, et remplit alors, il sera inutile de trouver une table vide à chaque fois de vous voulez l'appeler, il est donc plus simple de créer simplement une table vide.

Mon anglais ne sera pas mieux et c'est ma meilleure grammaire. Si vous ne l'aimez pas, votre libre de ne pas garder le lire, mais donner -rep pour quelqu'un qui essaie de l'aide rend les gens veulent pas aider du tout, surtout pour quelque chose comme la grammaire. Je suis un homme de chiffres et vars, pas la grammaire. Désolé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top