Frage

Ich verstehe nicht, die Gründe für die Entscheidung dieses Teils von Lua. Warum Indizierung bei 1 beginnen? Ich habe (wie viele andere auch) dieses großes Papier . Es scheint mir eine seltsame Ecke einer Sprache, die sehr angenehm ist, zu lernen und zu programmieren. Sie mich nicht falsch, Lua ist einfach toll, aber es hat eine Erklärung irgendwo sein. Das meiste, was ich gefunden (im Web) sagt nur der Index beginnt bei 1.em Punkt.

Es wäre sehr interessant zu lesen, was die Designer sagten über das Thema.

Beachten Sie, dass ich „sehr“ Anfänger in Lua bin, ich hoffe, ich bin nicht etwas offensichtlich über Tabellen fehlt.

War es hilfreich?

Lösung

ist Lua von Sol abstammen, eine Sprache, die für Erdölingenieure ohne formale Ausbildung in Computer-Programmierung. Die Leute denken nicht trainiert bei der Berechnung es seltsam ist verdammt Zählen bei Null zu beginnen. Durch die Annahme 1-basierten Array und String-Indexierung, Designer die Lua Verwechselung der Erwartungen ihrer ersten Kunden und Sponsoren zu vermeiden.

Obwohl auch ich fand sie am Anfang seltsam, ich habe die Liebe 0-basierte Arrays gelernt. Aber ich bekomme von OK mit Lua 1-basierten Arrays, insbesondere durch Lua mit generischen for Schleife und die ipairs betreiber ich in der Regel kann sich Gedanken über vermeiden, wie Arrays indiziert werden.

Andere Tipps

In Programmierung in Lua 's erste Diskussion von Tabellen, sie erwähnen:

Da kann man Index eine Tabelle mit einem beliebigen Wert, können Sie die Indizes eines Arrays mit einer beliebigen Anzahl, dass gefällt Ihnen starten. Es ist jedoch in Lua üblichen Arrays beginnen mit 1 (und nicht mit 0, wie in C) und mehrere Einrichtungen stehen zu dieser Konvention.

Später, im Kapitel über die Datenstrukturen, sagen sie fast die gleiche Sache wieder., Dass Lua eingebauten Einrichtungen assume 1-basierte Indizierung

Wie auch immer, es gibt ein Paar Bequemlichkeiten mit 1-basierter Indizierung. Das heißt, die # (Länge) Betreiber: Zugang t[#t] den letzte (numerisch) Index der Tabelle, und t[#t+1] Zugriffe 1 Vergangenheit den letzten Index. Für jemanden, der nicht bereits ausgesetzt waren 0-basierte Indizierung hat, wäre #t+1 intuitiver über das Ende einer Liste zu verschieben. Es gibt auch Lua for i = 1,#t Konstrukt, das ich fallen unter die gleiche Kategorie wie die vorherigen Punkt glauben, dass „1 auf die Länge“ sinnvoller sein kann als die Indizierung „0 auf die Länge minus 1“.

Aber, wenn Sie nicht die Einstellung von 0 basierter Indizierung brechen können, dann Lua 1-basierte Indizierung kann sicherlich eher hinderlich sein. Letztlich wollten die Autoren etwas, dass für sie gearbeitet ; und ich gebe zu, ich weiß nicht, was ihre Original Ziel ist es, aber es ist wahrscheinlich seitdem geändert.

Es ist ein sehr wichtiger Grund, um nicht-Arrays zählt von 1: Wenn Arrays bei Null anfangen, können Sie sie als algebraische Ringe auf natürliche Weise nutzen. Z.B. wir haben die Tage einer Woche (day={'mo', 'tu', 'we'...) und wir wollen, um durch sie. Dann würde es viel weniger mindbending zu schreiben sein:

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

als:

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

scheint nicht so schlecht auf den ersten zu sein, sondern versuchen, die Woche in die andere Richtung Zyklus.

Oder allgemeiner: wenn der Index eingestellt, um die Null fehlt, fehlt es an das neutrale Element der Addition. Immer dann, wenn es in Indexberechnungen benötigt wird, haben Indizes verschoben werden.

Ich bin ein Mathematikerin, aber ich habe die Tatsache akzeptiert, dass, wenn es um Programmierung geht, das Zählen von Null ist nur die bessere Option ..

Mein Verständnis ist, dass es auf diese Weise nur, weil die Autoren dachten, es wäre ein guter Weg, es zu tun, und nachdem sie die Sprache an die Öffentlichkeit gerollt diese Entscheidung erheblich verkalkt. (Ich vermute, es wäre die Hölle Lohn waren sie es heute ändern!) Ich habe noch nie eine besondere Begründung darüber hinaus zu sehen.

Vielleicht ein weniger wichtiger Punkt, aber man hat ich noch nicht gehört, erwähnt: Es gibt bessere Symmetrie in der Tatsache, dass das erste und letztes Zeichen in einer Zeichenfolge ist in 1 bzw. -1, anstelle von 0 und -1.

Tabelle [0] wird immer return null (null), es sei denn Sie assign Wert it yourself Tabelle [0] = 'some value' und dann Tabelle [0] wird zurückkehren 'einen Wert', die Sie zugewiesen.

Hier ein Beispiel:

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

Lua-Bibliotheken bevorzugen Verwendung Indizes, die jedoch bei 1. Starten Sie einen Index verwenden, können Sie wollen. Sie können 0, können Sie 1 verwenden, können Sie verwenden, -5. Es ist sogar in ihrem Handbuch, das bei ( https://www.lua.org gefunden werden kann /pil/11.1.html ).

In der Tat, hier etwas kühl ist interne lua Bibliotheken werden einige weitergegeben 0'en als 1'en behandeln. Nur vorsichtig sein, wenn ipairs verwenden.
So dass: ( "abc"): sub (0,1) == "a" und ( "abc"). Sub (1,1) == "a" wird wahr

 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

Der wahre Grund ist, dass die Sprache ist eine Implementierung der Definition in einem Gesetz von Portugal und dem wichtigsten Entwicklungszentrum in Brasilien und ihre Präferenz ist die Verwendung von Null oder leeren oder nichts als einen Index oder Index zu vermeiden. Allerdings funktioniert die Sprache die Verwendung eines Startindex erlaubt andere als 1 in einer Tabelle erstellen Funktion in einigen Versionen.

Es macht Sinn, zu jedem, dass, wenn ein

table = {}

Im Moment ist table leer. Also, wenn

table == {something}

Die Tabelle enthält so etwas, was es enthält Index 1 in table ist, wenn Sie wissen, was ich meine.

Was ich meinte, seine die Tabelle [0] vorhanden ist, und seine Tabelle = {}, die ihre leeren, jetzt ein Programmierer eine leere Tabelle nicht nennen, es setzt sie, und dann füllt sie, wird es nutzlos sein, eine leere Tabelle jedes Mal finden Sie es nennen wollen, so ist es einfacher, nur eine leere Tabelle zu erstellen.

Mein Englisch wird nicht besser, und das ist meine beste Grammatik. Wenn Sie nicht wie es tun, Ihre frei halten, um es nicht zu lesen, aber geben -rep für jemanden zu helfen versucht, macht die Menschen nicht überhaupt helfen wollen, vor allem für so etwas wie Grammatik. Ich bin ein Mann der Zahlen und VARs, nicht Grammatik. Es tut uns Leid.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top