blob: 7396fcf09922cf9e33e3ae65dffff87b91fb5c6d [file] [log] [blame]
walk_mapping(E)
FUNKTION:
void walk_mapping(mapping m, string fun [, mixed extra, ...])
void walk_mapping(mapping m, string fun, string|object ob
, mixed extra,...)
void walk_mapping(mapping m, closure cl, mixed extra,...)
PARAMETER:
m - durchzugehendes Mapping
fun/cl - zu rufende Methode/Closure
ob - Objekt/Dateiname, an dem Methode gerufen werden soll
extra - weitere Parameter fuer Methode/Closure
BESCHREIBUNG:
Ruft die Methode fuer jeden Eintrag im Mapping:
ob->func(key, value1, ..., valueN, extra,...)
beziehungsweise fuehrt die Closure fuer jeden dieser Eintraege aus:
funcall(cl, key, value1, ..., valueN, extra,...)
Die Schluessel werden als Wert uebergeben und die dazugehoerigen Werte
per Referenz, diese koennen somit also in der Funktion/Closure geaendert
werden.
Verwendung von Methoden:
Wenn bei der Angabe von 'fun' kein Objekt 'ob' in Form eines Strings
oder Objekts angegeben wird, wird this_object() angenommen.
Verwendung von Closures:
Es koennen sowohl Lfun-Closures als auch Lambda-Closures verwendet
werden. Lfun-Closures koennen, wenn im selben Objekt vorhanden auch
'private' oder/und 'static' deklariert sein, muessen aber zu dem
Zeitpunkt der Verwendung bekannt sein (Funktionsprototypen benutzen).
BEISPIELE:
// Liste mit Spielern durchgehen ...
mapping x=([ [/human:liafar]: 20,
[/dwarf:mesirii]: 50,
[/elf:zarniya]: 40,
[/feline:turbo]: 30]);
// ... und Werte aendern:
void add_val(object key, int val, int add) {
if(key->InFight())
val+=add;
else
val-=add;
}
// verschiedene Aufrufarten, identisches Resultat:
walk_mapping(x, "add_val", 0, 10);
walk_mapping(x, "add_val", this_object(), 10
walk_mapping(x, "add_val", "/players/jof/addierobjektmitmethode", 10);
walk_mapping(x, #'add_val, 10);
AeQUIVALENZCODE (nicht empfohlen, nur zum Verstaendnis!):
// so richtig aequivalent wird es nur mit einer Closure hier
int i, width;
mapping input;
mixed *index, *param;
width=get_type_info(input)[1];
param=allocate(width);
index=m_indices(input);
i=sizeof(index);
while(i--) {
j=width;
while(j-- > 1)
param[j]=input[index[i],j];
j[0]=index[i];
apply(cl, param);
// fun(index[i], input[index[i],0], input[index[i],1], ...);
}
SIEHE AUCH:
Arrays: filter(E), map(E)
Objektarrays: filter_objects(E), map_objects(E)
Mappings: filter_indices(E), map_indices(E)
Sonstiges: m_contains(E)
member()
m_indices(E), m_values(E)
20.Jan 2005 Gloinson