Dieser Guide richtet sich an diejenigen, die bereits Erfahrung im Coding mit Lua haben. Grundkenntnisse über Lua werden vorausgesetzt.
Allgemeines:
Der global Table:
Metatables:
Was sind Metatables?:
Was sind Metamethods?:
Beispiele:
Allgemeines:
Der global Table:
Der global Table enthält alle globalen Variablen. Der global Table ist über die Variable _G verfügbar. Wird eine neue globale Variable gesetzt, wird diese in den global Table geschrieben.
Mit dieser Info können wir z.B. auf globale Variablen zugreifen, dessen Name lokal genutzt wird.
Beispiel:
Ausserdem ist es über den global Table möglich, globale Variablen zu setzen, auch wenn lokal eine Variable mit gleichem Namen zugreifbar ist:Code:name = "Sensi" local name = "Faggot: Akkelos" print(name)--immer lokale VOR globalen Variablen (in diesem Fall also -> "Faggot: Akkelos") print(_G.name)--über den global Table -> "Sensi"
Code:local name = "Sensi" name = "Faggot: Akkelos"--überschreibt die lokale Variable "name", weil sie an dieser Stelle zugreifbar ist _G.name = "Faggot: Akkelos"--setzen der globalen Variable per global Table
Metatables:
Was sind Metatables?:
Metatables sind Tables, die Grundfunktionen eines Tables (z.B. das Verhalten beim Aufruf der tostring() Funktion) enthalten.Metamethods:
Mit der Funktion getmetatable(<table>) bekommt man den Metatable eines Tables zurück, mit setmetatable(<table>, <table>) setzt man diesen.
Was sind Metamethods?:
Metamethods sind die Funktionen, die im Metatable liegen, um das Verhalten des Tables bei bestimmten Operationen zu definieren.Welche Metamethods gibt es?:
Es sind verschiedenste Sachen über Metatables / Metamethods möglich, z.B. die Erstellung eines Tables, aus dem nur gelesen werden darf (read-only-table) oder read-only-values (Werte, die nach ihrer Deklaration nur gelesen werden dürfen)
Funktionsname Wird aufgerufen, wenn ... Parameter Rückgabe Sonstiges __index ... versucht wird, auf einen undefinierten Key zuzugreifen #1: Table, auf den zugegriffen wurde #2: Angefragter Key Der Wert, der zurückgegeben werden soll (Standard: nil) #1: Anstatt einer Funktion kann hier auch ein anderer Table hinterlegt werden. #2: Kann durch rawget(<table>, <key>) ignoriert werden __newindex ... ein neuer Key auf den Table gesetzt wird #1: Table, auf den der Key gesetzt werden soll #2: Zu setzender Key (Keine) #1: Kann durch rawset(<table>, <key>, <value>) ignoriert werden __mode ... ein neuer Key auf den Table gesetzt wird (Keine) - Stringwert "k", "v" oder "kv" der besagt, ob die Referenzen auf dem Table relevant für den Garbagecollector sind. (Keine (weil keine Funktion)) - __call ... der Table als Funktion genutzt wird #1: Table, der als Funktion genutzt wurde #...: Übergebene Parameter was auch immer gewollt ist - __metatable ... getmetatable(<table>) aufgerufen wird (Keine) Wert, der zurückgegeben werden soll, wenn getmetatable(<table>) aufgerufen wird - __tostring ... tostring(<table>) aufgerufen wird #1: Der Table, der an tostring(<table>) übergeben wurde Der resultierende String - __len ... table.getn(<table>) aufgerufen wird #1: Der Table, der an table.getn(<table>) übergeben wurde Die resultierende Länge - __gc ... der Garbagecollector den Table löschen möchte #1: Der Table, der gelöscht werden soll (Keine) - __unm ... der negative Wert (-<table>) angefordert wird #1: Der Table, für den der negative Wert angefordert wird Das Ergebnis - __add ... eine Addition mit dem Table ausgeführt werden soll #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 Das Ergebnis der Addition (Operator1 + Operator2!) Beispiel: <table> + 1 -> Operator1 = <table>, Operator2 = 1 bzw.: 1 + <table> -> Operator1 = 1, Operator2 = <table> __sub ... eine Subtraktion mit dem Table ausgeführt werden soll #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 Das Ergebnis der Subtraktion (Operator1 - Operator2!) - __mul ... eine Multiplikation mit dem Table ausgeführt werden soll #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 Das Ergebnis der Multiplikation (Operator1 * Operator2!) - __div ... eine Division mit dem Table ausgeführt werden soll #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 Das Ergebnis der Division (Operator1 / Operator2!) - __mod (nicht in Lua 5.0) - - - __pow ... eine Potenz des Tables angefordert wird #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 Das Ergebnis (Operator1 ^ Operator2!) - __concat ... der Table konkateniert wird #1: Wert1, #2: Wert2 Der einzufügende String bei einer Konkatenation (Empfohlen: tostring(v1) .. tostring(v2)) - __eq ... Prüfung auf gleichheit (Achtung! Nur wenn beide Operatoren die selbe (nicht nur Inhaltlich) Funktion unter __eq hinterlegt haben) #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 true oder false - __lt ... Prüfung auf größer / kleiner #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 true oder false - __le ... Prüfung auf gröper / kleiner oder gleich #1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2 true oder false -
Beispiele: