Ich verstehe die Gründe für die Entscheidung dieses Teils von Lua nicht. Warum beginnt die Indizierung bei 1? Ich habe (wie viele andere auch) dieses großartige Papier gelesen . Es scheint mir eine seltsame Ecke einer Sprache zu sein, die sehr angenehm zu lernen und zu programmieren ist. Versteh mich nicht falsch, Lua ist einfach großartig, aber irgendwo muss es eine Erklärung geben. Das meiste, was ich (im Web) gefunden habe, ist nur zu sagen, dass der Index bei 1 beginnt. Punkt.
Es wäre sehr interessant zu lesen, was die Designer zu diesem Thema gesagt haben.
Beachten Sie, dass ich in Lua "sehr" Anfänger bin. Ich hoffe, ich vermisse nichts Offensichtliches an Tischen.
Antworten:
Lua stammt von Sol ab, einer Sprache, die für Erdölingenieure ohne formale Ausbildung in Computerprogrammierung entwickelt wurde. Leute, die nicht in Computer geschult sind, finden es verdammt komisch, bei Null zu zählen. Durch die Einführung einer 1-basierten Array- und String-Indizierung konnten die Lua-Designer die Erwartungen ihrer ersten Kunden und Sponsoren nicht verwechseln.
Obwohl ich sie am Anfang auch komisch fand, habe ich gelernt, 0-basierte Arrays zu lieben. Aber ich komme mit Luas 1-basierten Arrays gut zurecht, insbesondere mit Luas generischer
for
Schleife und demipairs
Operator - ich kann es normalerweise vermeiden, mir Gedanken darüber zu machen, wie Arrays indiziert werden.quelle
< length
ist dies viel praktischer und in den "verrückten 0-basierten Sprachen" leichter zu lesen. Ich gestehe, wenn ich sehe, dass eine Schleife von 1 iteriert,In der Programmierung in Luas erster Diskussion über Tabellen erwähnen sie:
Später, im Kapitel über Datenstrukturen, sagen sie fast dasselbe noch einmal: Die integrierten Funktionen von Lua gehen von einer 1-basierten Indizierung aus.
Auf jeden Fall bietet die Verwendung der 1-basierten Indizierung einige Vorteile. Der
#
Operator (Länge):t[#t]
Zugriff auf den letzten (numerischen) Index der Tabelle undt[#t+1]
Zugriff auf 1 nach dem letzten Index. Für jemanden, der noch keiner 0-basierten Indizierung ausgesetzt war,#t+1
wäre es intuitiver, über das Ende einer Liste hinauszugehen. Es gibt auch Luasfor i = 1,#t
Konstrukt, von dem ich glaube, dass es unter dieselbe Kategorie fällt wie der vorherige Punkt, dass "1 auf die Länge" sinnvoller sein kann, als "0 auf die Länge minus 1" zu indizieren.Wenn Sie jedoch die Denkweise der 0-basierten Indizierung nicht brechen können, kann die 1-basierte Indizierung von Lua sicherlich eher hinderlich sein. Letztendlich wollten die Autoren etwas, das für sie funktionierte ; und ich gebe zu, ich weiß nicht, was ihr ursprüngliches Ziel war, aber es hat sich wahrscheinlich seitdem geändert.
quelle
Mein Verständnis ist, dass dies so ist, nur weil die Autoren dachten, es wäre ein guter Weg, dies zu tun, und nachdem sie die Sprache der Öffentlichkeit zugänglich gemacht hatten, verkalkte sich diese Entscheidung erheblich. (Ich vermute, es wäre die Hölle zu bezahlen, wenn sie es heute ändern würden!) Ich habe darüber hinaus noch nie eine bestimmte Rechtfertigung gesehen.
quelle
array[0] == array + 0;
und 1-basiertes Zählen natürlicher ist, wenn Array wirklich eine Hash-Tabelle ist.Vielleicht ein weniger wichtiger Punkt, aber einer, den ich noch nicht erwähnt habe: Es gibt eine bessere Symmetrie in der Tatsache, dass das erste und das letzte Zeichen in einer Zeichenfolge bei 1 bzw. -1 statt bei 0 und -1 liegen.
quelle
Lua-Bibliotheken bevorzugen die Verwendung von Indizes, die bei 1 beginnen. Sie können jedoch jeden gewünschten Index verwenden. Sie können 0 verwenden, Sie können 1 verwenden, Sie können -5 verwenden. Es ist sogar in ihrem Handbuch, das unter ( https://www.lua.org/pil/11.1.html) zu finden ist ) zu finden ist.
Tatsächlich ist etwas Cooles hier, dass interne Lua-Bibliotheken EINIGE übergebene Nullen als Einsen behandeln. Seien Sie vorsichtig, wenn Sie ipairs verwenden.
Also das:
("abc"):sub(0,1) == "a" and ("abc"):sub(1,1) == "a"
wird wahr sein.quelle
({'a', 'b'})[1]
bewerten zu'b'
nicht'a'
aber? Das scheint mir eingebaut zu sein.({[0] = 'a', 'b'})[1]
Der wahre Grund ist, dass die Sprache eine Umsetzung der Definition in einem portugiesischen Gesetz ist und das Hauptentwicklungszentrum in Brasilien war. Sie bevorzugen es, die Verwendung von Null oder Leer oder Nichts als Index oder Index zu vermeiden. Die Sprache erlaubt jedoch in einigen Versionen die Verwendung eines anderen Startindex als 1 in einer Tabellenerstellungsfunktion.
quelle
Tabelle [0] gibt IMMER nil (null) zurück, es sei denn, Sie weisen ihm selbst einen Wert zu. table [0] = 'irgendein Wert' und dann gibt Tabelle [0] 'irgendeinen Wert' zurück, den SIE zugewiesen haben.
Hier ein Beispiel:
quelle
Es macht für jeden Sinn, dass wenn a
Im Moment
table
ist leer. Also wannDie Tabelle enthält etwas, also enthält sie Index 1,
table
wenn Sie wissen, was ich meine.Was ich damit gemeint habe, ist, dass diese Tabelle [0] existiert und ihre Tabelle = {}, die leer ist. Jetzt ruft ein Programmierer keine leere Tabelle mehr auf, setzt sie und füllt sie dann aus. Es ist nutzlos, eine leere zu finden Tabelle jedes Mal, wenn Sie es aufrufen möchten, so ist es einfacher, nur eine leere Tabelle zu erstellen.
Mein Englisch wird nicht besser und das ist meine beste Grammatik. Wenn es dir nicht gefällt, kannst du es nicht weiter lesen, aber wenn du -rep für jemanden gibst, der versucht zu helfen, wollen die Leute überhaupt nicht helfen, besonders für etwas wie Grammatik. Ich bin ein Mann mit Zahlen und Vars, nicht mit Grammatik. Es tut uns leid.
quelle
0
als einziges Element verwendet, ist noch nicht leer. Tatsächlich unterstützt Lua dies, es ist einfach nicht die Standardkonvention.