[[http://www.siedler-games.de|{{:sg-link.jpg|}}]] ====== Die Table-Funktionen ====== ===== Einleitung ===== FIXME Hier sollte noch ein einleitender Text hin! ---- ===== Funktionsübersicht ===== ^Funktion^Syntax^Beschreibung^ |**[[#concat|concat]]**|table.concat(table [, _sep [, _i [, _j]]])|Verbindet die Elemente einer Tabelle [von _i bis _j] miteinander zu einem String [mit Seperator _sep]| |**[[#foreach|foreach]]**|table.foreach(_table, _f)|Wendet nacheinander die Funktion _f auf jedes Element der Tabelle _table an und übergibt dabei bei jedem Durchlauf das jeweilige Schlüssel-Wert Paar| |**[[#foreachi|foreachi]]**|table.foreachi(_table, _f)|Wie //foreach// nur das hier das jeweilige Index-Wert Paar an die Funktion _f übergeben wird| |**[[#getn|getn]]**|table.getn(_table)|Gibt die Anzahl der Elemente einer Tabelle _table zurück| |**[[#insert|insert]]**|table.insert(_table, [_pos,] _value)|Fügt einen Wert _value in eine Tabelle _table ein. Wenn eine Position _pos angegeben wird, wird der Wert vor dem sich aktuell an der Position befindlichen Wert eingefügt| |**[[#remove|remove]]**|table.remove(_table [, _pos])|Entfernt ein Element aus einer Tabelle _table. Wenn eine Position _pos angegeben wird, wird das Element, welches sich aktuell an der Position befindet entfernt, ansonsten das jeweils letzte Element. Die Funktion liefert das entfernte Element zurück. Nach dem Entfernen eines Elements wird die Tabelle sequenziell neu indexiert und die Tabellen-Größe (siehe table.getn) wird aktualisiert| |**[[#setn|setn]]**|table.setn(_table, _n)|Setzt die Größe einer Tabelle _table explizit auf die Größe _n. Enthält die Tabelle einen Wert n, so wird dieser aktualisiert| |**[[#sort|sort]]**|table.sort(_table [, _comp])|Sortiert eine Tabelle _table. Die Standardsortierung, wenn keine Sortier-Funktion _comp angegeben wird, erfolgt aufsteigend (a < b)| ---- ===== Beispiele & ausführliche Erläuterungen ===== FIXME Hier sollte zu jeder Table-Funktion mind. 1 Beispiel hin. Zusätzlich sollten die Funktionen nochmals ausführlich dokumentiert werden. Es wäre auch gut, wenn die Beispiele konkret auf DEdK bezogen werden! ---- ==== concat ==== **table.concat(_table [, _sep [, _i [, _j]]])** - Beispiel ohne Angabe von **//_sep //**, **//_i//** und **//_j//**table.concat({ 1, 2, "drei", 4, "fuenf" })12drei4fuenf - Beispiel mit Angabe eines Seperators **//_sep //**table.concat({ 1, 2, "drei", 4, "fuenf" }, ", ")1, 2, drei, 4, fuenf - Beispiel mit Angabe eines Seperators **//_sep //** und einem Startwert **//_i//**table.concat({ 1, 2, "drei", 4, "fuenf" }, ", ", 2)2, drei, 4, fuenf - Beispiel mit Angabe eines Seperators **//_sep //**, einem Startwert **//_i//** und einem Endwert **//_j//**table.concat({ 1, 2, "drei", 4, "fuenf" }, ", ", 2, 4)2, drei, 4 Jedes Element der Tabelle **//muss//** in einen String umwandelbar sein! Deshalb lassen sich auch **//keine Tables//** miteinander verbinden, da diese nicht in einen String umwandelbar sind. ---- ==== foreach ==== **table.foreach(_table, _f)**\\ Folgende Tabelle sei gegeben:_table={"eins", zwei="drei", "vier", "zwei", fuenf="fuenf"} - Beispieltable.foreach(_table, Message)1 2 3 fuenf zweiHier werden die Schlüssel-/Indexwerte ausgegeben, nicht aber der eigentliche Wert. Beachte die "automatische" Sortierung: (Index) Zahlenwerte (x < y), (Schlüssel) Stringwerte (a < b) - Beispieltable.foreach(_table, function(k,v) Message("Key: "..k.." Value: "..v) end)Key: 1 Value: eins Key: 2 Value: vier Key: 3 Value: zwei Key: fuenf Value: fuenf Key: zwei Value: dreiHier werden sowohl die Schlüssel-/Indexwerte, als auch die Werte selbst ausgegeben. Die Funktion foreach übergibt **//immer//** das Wertepaar aus Index + Wert, bzw. aus Schlüssel + Wert im Gegensatz zu der Funktion foreachi, die **//nur die Index-Wert Paare//** übergibt, nicht aber die Schlüssel-Wert Paare (siehe auch **[[#foreachi|foreachi]]**) - Beispieltable.foreach(Diplomacy, function(k,v) Message("Key: "..k.." Value: "..v) end)Key: Neutral Value: 2 Key: Friendly Value: 1 Key: Hostile Value: 3Die Funktion eignet sich während des Scriptens auch gut dafür, um Tables auszulesen. ---- ==== foreachi ==== **table.foreachi(_table, _f)**\\ Folgende Tabelle sei gegeben:_table={"eins", zwei="drei", "vier", "zwei", fuenf="fuenf"} - Beispieltable.foreachi(_table, function(k,v) Message("Key: "..k.." Value: "..v) end)Key: 1 Value: eins Key: 2 Value: vier Key: 3 Value: zwei Beachte dass hier im Gegensatz zu der Funktion foreach nur die Index-Wert Paare ausgegeben werden (siehe auch **[[#foreach|foreach]]**). ---- ==== getn ==== **table.getn(_table)**\\ Folgende Tabelle sei gegeben:_table={"eins", "zwei", "drei"} - BeispielMessage(table.getn(_table))3Wenn kein Wert für **//n//** in der Tabelle vorhanden ist und auch kein **//nil//**-Wert, zählt die Funktion die Anzahl der Elemente. Folgende Tabelle sei gegeben:_table={"eins", "zwei", "drei"; n=5} - BeispielMessage(table.getn(_table))5Ist ein Wert für **//n//** in der Tabelle vorhanden, so übersteuert dieser den Zählwert der Funktion. - Beispieltable.setn(_table, 10) Message(table.getn(_table))10 Der Wert für **//n//** kann auch mit Hilfe der Funktion **[[#setn|table.setn]]** gesetzt werden. Folgende Tabelle sei gegeben:_table={"eins", "zwei", nil, "vier"} - BeispielMessage(table.getn(_table))2Die Zählfunktion bricht ab, sobald sie auf einen **//nil//**-Wert trifft. ---- ==== insert ==== **table.insert(_table, [_pos,] _value)**\\ Folgende Tabelle sei gegeben:_table={1, 2, "vier"} - Beispieltable.insert(_table, "drei") table.foreach(_table, function(k,v) Message("Key: "..k.." Value: "..v) end)Key: 1 Value: 1 Key: 2 Value: 2 Key: 3 Value: vier Key: 4 Value: dreiOhne eine Angabe der Position _pos wird der neue Wert am Ende der Tabelle eingefügt. - Beispieltable.insert(_table, 3, "drei") table.foreach(_table, function(k,v) Message("Key: "..k.." Value: "..v) end)Key: 1 Value: 1 Key: 2 Value: 2 Key: 3 Value: drei Key: 4 Value: vierWenn eine Position _pos angegeben wird, wird der Wert vor dem sich aktuell an der Position befindlichen Wert eingefügt. Folgende Tabelle sei gegeben:_table={1, 2, "vier"; n=10} - Beispieltable.insert(_table, "drei") table.foreach(_table, function(k,v) Message("Key: "..k.." Value: "..v) end)Key: 1 Value: 1 Key: 2 Value: 2 Key: 3 Value: vier Key: 11 Value: drei Key: n Value: 11Wenn die Tabelle einen Wert **//n//** besitzt, und ein Wert am Ende eingefügt (eigentlich angehängt) wird, erhält er auch den entsprechenden Indexwert. Bei den dazwischenliegenden Elementen handelt es sich um **//nil//**-Werte (siehe auch **[[#getn|getn]]**). ---- ==== remove ==== **table.remove(_table, [_pos])**\\ Folgende Tabelle sei gegeben:_table={1, 2, "vier", "drei"} - BeispielMessage(table.remove(_table))dreiOhne eine Angabe der Position _pos wird das jeweils letzte Element der Tabelle gelöscht und von der Funktion zurückgegeben. - BeispielMessage(table.remove(_table, 3))vierWenn eine Position _pos angegeben wird, wird das Element, welches sich an der Stelle der Tabelle befindet gelöscht und von der Funktion zurückgegeben. Folgende Tabelle sei gegeben:_table={1, 2, "vier", "drei"; n=10} - BeispielMessage(table.getn(_table)) Message(table.remove(_table)) Message(table.getn(_table))10 9Da die Tabelle durch **//n=10//** eine Länge von 10 hat, wobei die Elemente von Indexwert 5 bis 10 **//nil//**-Werte sind, liefert die Funktion beim Löschen des letzten Elementes auch **//nil//** zurück. Die Größe der Tabelle verringert sich aber auf 9. - BeispielMessage(table.getn(_table)) Message(table.remove(_table, 3)) Message(table.getn(_table))10 vier 9 - Beispiel\\ Natürlich kann man auch alle Elemente einer Tabelle in einer Schleife löschen:for i=1,table.getn(_table) do table.remove(_table) end oder rückwärts:for i=table.getn(_table),1,-1 do table.remove(_table) end Aufpassen muss man dagegen, wenn man indizierte Elemente löschen möchte und dazu die Variable der Schleifen-Funktion benutzt! Dann kann man nur die Rückwärts-Schleife verwenden!\\ FIXME Beispiel einfügen! ----