Lua Logo
Tables

Warum so groß geschrieben?

Tables sind in LUA das komfortabelste, was ich je gesehen habe. Nicht dass sie sehr kompliziert wären, aber sie sind so umfangreich und so gut zu gebrauchen, dass wir eine ganze Zeit damit beschäftigt sein werden. Im Grunde genommen hören wir nicht auf damit beschäftigt zu sein. Da sich das komplette LUA in einem Table befindet.

Im

_G

In diesem Table befindet sich alles, einfach alles, was bekannt ist.
Was nicht dort drin steht gibt es nicht oder ist irgendwo local. (also nicht da, oder nur da wenn dieser Block ausgeführt wird)

Darüber hinaus stellt uns LUA in einigen Tables etliche Funktionen zur Verfügung, die wir zum einen nicht schreiben müssen und zum anderen sind sie schneller.
Warum schneller? Sie sind meist in einer Programmiersprache "C" geschrieben, die sich ganz nahe am Betriebssystem befindet.
Diese Sprache ist nicht einfach zu programmieren. Darin wird es einem nicht so leicht gemacht wie in LUA. Dafür ist sie aber ca. 3-mal so schnell wie LUA.
(Aber LUA ist auch fix)

Da war das Vorwort der Seite ja noch kürzer. ;) Stimmt

Was kennen wir vom table?

  • Es ist eine Variable
  • Wie jede Variable hat es einen Namen
  • Ein table fängt an mit {
  • und endet mit }
  • Ein table kann andere Variablen beherbergen (alle, auch andere Tables)
  • Es gibt zwei verschiedene Formen des Tables
  • Es kann numerisch sein meinTable[4]
  • oder auch einem Namen haben meinTable.meineVariable

Das wichtigste überhaupt, ist, dem Übersetzer zu sagen, wir machen ein table
Das sagen wir ihm in dem wir das table initialisieren.

meinTable = {}

Jetzt weiß er, alles was jetzt kommt gehört zu table.
(man kann auch direkt Werte übergeben, aber das tun wir jetzt nicht)

Table mit Namen

Wir arbeiten jetzt zuerst unser Script um, damit die Werte in einem table sind. Schön ordentlich; schön handlich.

Ausgangspunkt:

player1Name = "Ossler"
player1Gold = 1000
player1Lebt = true
player2Name = "Lorender"
player2Gold = 1500
player2Lebt = true

Die tables dazu:

Initialisieren:

player1 = {}
player2 = {}


Werte vergeben Version 1

-- Player 1
player1.name = "Ossler"
player1.gold = 1000
player1.lebt = true

-- Player 2
player2.name = "Lorender"
player2.gold = 1500
player2.lebt = true
player2.steine = 800


Werte vergeben Version 2

-- Player 1
player1 = {
name = "Ossler", -- hier muss ein Komma hin
gold = 1000, -- hier muss ein Komma hin
lebt = true, -- hier kann ein Komma hin
}
-- Player 2

player2 = {
name = "Lorender",-- hier muss ein Komma hin
gold = 1500, -- hier muss ein Komma hin
lebt = true, -- hier muss ein Komma hin
steine = 800, -- hier kann ein Komma hin
}

Werte vergeben Version 3 (nicht immer übersichtlich)

player1 = {name = "Ossler", gold = 1000, lebt = true}

Alle Versionen sind absolut gleichwertig. Es kommt auf den Fall an, was ist zweckmäßig, was übersichtlich?

Beispiel für ein table im table:

player1.position = { X = 120, Y = 360}

Dies müsste man so erzeugen:

player1 = {}
-- wir sagen player1 ist ein table
player1.position = { X = 120, Y = 360}
--[[ wir sagen player1.position ist auch ein table und besetzten es sofort mit Werten]]

Alle Versionen sind absolut gleichwertig. Es kommt auf den Fall an; was ist zweckmäßig, was übersichtlich? Wir werden alle benutzen.

Jetzt setze ich zwar schon einiges voraus, aber die tables liegen mir am Herzen.

Version 1.Was machen wir?

Wir weisen einer Variablen einen Wert zu. Kennen wir doch längst.
Aber sie hat einen Punkt in der Mitte. Na und?
Der Punkt sagt, dass links die Mutter, und dass rechts das Kind steht. Aha, erzähl weiter.

Eine Mutter kann viele Kinder haben. Und wie im Leben sind alle Kinder unterschiedlich.
Kann ein Kind auch Kinder haben? Klar das wir sind doch nicht in China. Man muss nur sagen dass es Kinder gibt

mutter = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter.kind = 5

Und das Kind? Kann auch Kinder haben. Wir sind ja nicht so.

mutter = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter.kind = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter.kind.kindesKind = "willi"

Den Willi wollten wir doch in Ruhe lassen? Das ist so verrückt wie dieser Willi.
Geht das so weiter? Ja, aber das Papier reicht nicht aus.
Und wenn eines der Kinder keine Kinder hat? Kein Problem. Wir programmieren ja LUA

mutter = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter.kind2 = 5
mutter.tochter.kind1 = {} -- hier sag ich, dass es Kinder gibt
mutter.tochter.kind1.kindesKind1 = "willi"
mutter.tochter.kind1.kindesKind2 = "elvira"
mutter.tochter.kind1.schuhGroesse = 46

Alles klar? Das werden wir so sicher nicht ganz so brauchen oder wenn, dann sehr selten.
Aber es geht. Und das sollte man wissen. Könnte aber unübersichtlich werden.

Langsam auf der Zunge zergehen lassen

Da war doch noch die andere, die numerische Form.

Table mit Zahlen

Die ist genau so einfach. Wir können den Kindern auch eine Nummer geben (besser für Schleifen)

mutter = {}
mutter[1] = true
mutter[2] = "Schweißfüße"

Kinder können sie auch haben. Genau wie die anderen. Die Vielfalt der Möglichkeiten macht es aber jetzt auch wieder etwas komplizierter.
Einfach wäre:

mutter = {}
mutter[1] = {}
mutter[1][1] = "Ottoplatte"

Das Irre an der Geschichte ist, diese Werte können auch 0, negativ sein, Dezimalstellen haben. Alles egal. Nur wandelt LUA dies dann wieder in die andere Form um ohne dass wir das merken. Diese von oben mit den Namen.
Bleiben wir doch besser beim Alten und nehmen gerade Zahlen, denn so wollen wir sie ja gebrauchen

Aber probieren was geht, das können wir doch!!? Klar doch

Das, was geht, ist in anderen Sprachen unmöglich. Es ist für mich jetzt wieder zuviel. Ich gehe schlafen und mache morgen weiter. Das muss ich erst verkraften.

Ich denke das müssen wir in der Anwendung lernen/vertiefen.

-- Player 1

player1[1] = "Ossler"
player1[2] = 1000
player1[3] = true

-- Player 2

player2[1] = "Lorender"
player2[2] = 1500
player2[3] = true
player2[4] = 800

Das geht zwar auch so, für unsere Zwecke ist das aber nicht sinnvoll. Wir müssten uns immer merken, dass [1] der Name, [2] das Gold, [3] ob er lebt und [4] die Steine sind.

Da wäre es gemischt doch schon besser für und. Und das geht prima.

Table mit Namen und Zahlen

player = {} -- für alle

-- Player 1

player[1] = {}
player[1].name = "Ossler"
player[1].gold = 1000
player[1].lebt = true

-- Player 2

player[2] = {}
player[2].name = "Lorender"
player[2].gold = 1500
player[2].lebt = true
player[2].steine = 800

Klasse, das ist schon ganz gut. Jetzt können wir in einer Schleife suchen welcher player lebt, oder Lorender heiß oder was auch immer.

Nur, wir wissen ja nicht wie groß das table ist. Kommt noch; immer mit der Ruhe

Man kann dies mischen, wie man möchte. Nur immer überlegen, was ist sinnvoll für meine Zwecke?

familie = {}
familie[1]={}
familie[1].mutter="Erna"
familie[1].vater="Horst"
familie[1].kinder={}
familie[1].kinder[1]="Jessica"
familie[1].kinder[2]="Thomas"


Nochmal ein Bildchen:
tables
Die Vervielfältigung der auf diesen Seiten enthaltenen Informationen und Grafiken ist untersagt, ausgenommen davon ist sämtlicher auf diesen Seiten angezeigter Quellcode.
Siehe auch: Haftungsausschluss
Copyright © Robert Schmitz 2006