blob: 7396fcf09922cf9e33e3ae65dffff87b91fb5c6d [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001walk_mapping(E)
2
3FUNKTION:
4 void walk_mapping(mapping m, string fun [, mixed extra, ...])
5 void walk_mapping(mapping m, string fun, string|object ob
6 , mixed extra,...)
7 void walk_mapping(mapping m, closure cl, mixed extra,...)
8
9PARAMETER:
10 m - durchzugehendes Mapping
11 fun/cl - zu rufende Methode/Closure
12 ob - Objekt/Dateiname, an dem Methode gerufen werden soll
13 extra - weitere Parameter fuer Methode/Closure
14
15BESCHREIBUNG:
16 Ruft die Methode fuer jeden Eintrag im Mapping:
17 ob->func(key, value1, ..., valueN, extra,...)
18 beziehungsweise fuehrt die Closure fuer jeden dieser Eintraege aus:
19 funcall(cl, key, value1, ..., valueN, extra,...)
20
21 Die Schluessel werden als Wert uebergeben und die dazugehoerigen Werte
22 per Referenz, diese koennen somit also in der Funktion/Closure geaendert
23 werden.
24
25
26 Verwendung von Methoden:
27 Wenn bei der Angabe von 'fun' kein Objekt 'ob' in Form eines Strings
28 oder Objekts angegeben wird, wird this_object() angenommen.
29
30 Verwendung von Closures:
31 Es koennen sowohl Lfun-Closures als auch Lambda-Closures verwendet
32 werden. Lfun-Closures koennen, wenn im selben Objekt vorhanden auch
33 'private' oder/und 'static' deklariert sein, muessen aber zu dem
34 Zeitpunkt der Verwendung bekannt sein (Funktionsprototypen benutzen).
35
36BEISPIELE:
37 // Liste mit Spielern durchgehen ...
38 mapping x=([ [/human:liafar]: 20,
39 [/dwarf:mesirii]: 50,
40 [/elf:zarniya]: 40,
41 [/feline:turbo]: 30]);
42
43 // ... und Werte aendern:
44 void add_val(object key, int val, int add) {
45 if(key->InFight())
46 val+=add;
47 else
48 val-=add;
49 }
50
51 // verschiedene Aufrufarten, identisches Resultat:
52 walk_mapping(x, "add_val", 0, 10);
53 walk_mapping(x, "add_val", this_object(), 10
54 walk_mapping(x, "add_val", "/players/jof/addierobjektmitmethode", 10);
55
56 walk_mapping(x, #'add_val, 10);
57
58
59AeQUIVALENZCODE (nicht empfohlen, nur zum Verstaendnis!):
60 // so richtig aequivalent wird es nur mit einer Closure hier
61 int i, width;
62 mapping input;
63 mixed *index, *param;
64
65 width=get_type_info(input)[1];
66 param=allocate(width);
67 index=m_indices(input);
68 i=sizeof(index);
69 while(i--) {
70 j=width;
71 while(j-- > 1)
72 param[j]=input[index[i],j];
73 j[0]=index[i];
74
75 apply(cl, param);
76 // fun(index[i], input[index[i],0], input[index[i],1], ...);
77 }
78
79SIEHE AUCH:
80 Arrays: filter(E), map(E)
81 Objektarrays: filter_objects(E), map_objects(E)
82 Mappings: filter_indices(E), map_indices(E)
83
84 Sonstiges: m_contains(E)
85 member()
86 m_indices(E), m_values(E)
87
8820.Jan 2005 Gloinson