[Guide] Lua Allgemeines, Metatables, Metamethods (fortgeschrittener Guide)

11/07/2015 18:22 rollback#1
Dieser Guide richtet sich an diejenigen, die bereits Erfahrung im Coding mit Lua haben. Grundkenntnisse über Lua werden vorausgesetzt.

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:
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"
Ausserdem ist es über den global Table möglich, globale Variablen zu setzen, auch wenn lokal eine Variable mit gleichem Namen zugreifbar ist:
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.

Mit der Funktion getmetatable(<table>) bekommt man den Metatable eines Tables zurück, mit setmetatable(<table>, <table>) setzt man diesen.
Metamethods:
Was sind Metamethods?:
Metamethods sind die Funktionen, die im Metatable liegen, um das Verhalten des Tables bei bestimmten Operationen zu definieren.

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)
Welche Metamethods gibt es?:
FunktionsnameWird aufgerufen, wenn ...ParameterRückgabeSonstiges
__index... versucht wird, auf einen undefinierten Key zuzugreifen#1: Table, auf den zugegriffen wurde #2: Angefragter KeyDer 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 Parameterwas 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 wurdeDer resultierende String-
__len... table.getn(<table>) aufgerufen wird#1: Der Table, der an table.getn(<table>) übergeben wurdeDie 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 wirdDas Ergebnis-
__add... eine Addition mit dem Table ausgeführt werden soll#1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2Das 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: Operator2Das Ergebnis der Subtraktion (Operator1 - Operator2!)-
__mul... eine Multiplikation mit dem Table ausgeführt werden soll#1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2Das Ergebnis der Multiplikation (Operator1 * Operator2!)-
__div... eine Division mit dem Table ausgeführt werden soll#1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2Das 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: Operator2Das Ergebnis (Operator1 ^ Operator2!)-
__concat... der Table konkateniert wird#1: Wert1, #2: Wert2Der 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: Operator2true oder false-
__lt... Prüfung auf größer / kleiner#1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2true oder false-
__le... Prüfung auf gröper / kleiner oder gleich#1: Operator1 (Achtung! Nicht zwingend "dieser Table"), #2: Operator2true oder false-

Beispiele:


















11/07/2015 18:23 Yiv#2
Manchmal frage ich mich, warum hast du so viel Zeit und ich nicht? :(
Danke dafür, aber brauche ich zur Zeit nicht, kann dich ja für Lua knechten :)

MfG
11/07/2015 18:23 .J0ker#3
gj
11/07/2015 18:25 .K0rí#4
Sehr übersichtlich gestaltet. Danke für das Release :)
11/07/2015 18:25 Kampfzwerg!#5
krass.... das ist der Sensi eben :)
hast du schöne gemacht :)

schöne grüße

Kampfzwerg
11/07/2015 18:38 DreamT™#6
So viel Zeit für solche Dinge möchte ich auch mal haben :)

Sehr übersichtlich und verständlich geschrieben. Wird vielen ein wenig Hilfestellung sein. Danke für die Mühe!
11/07/2015 23:46 .Ɓurly#7
Hab zwar keine Ahnung was das ist, aber weil du dir so viel Mühe gegeben hast und wir gerade im Ts sind, bekommst du trotzdem n Thanks ;)

PS: Fix dein BO3


Mfg.
11/08/2015 01:20 ThePfosten#8
hast dir viel mühe gegeben thx
11/08/2015 02:38 MaxChri#9
Oha hast dir ja richtig viel Mühe gegeben, da wird dann Lua doch wieder erheblicher *_*
Thanks 4 release :)