filter¶
BEMERKUNGEN¶
Achtung, die Elemente in ‘arr’ werden nicht tief kopiert, sind sie also selbst Arrays oder Mappings, so fuehrt eine spaetere Aenderung im Rueckgabe-Arrays zur Aenderung im Ursprungsarray:
int *i, *j; i=({({1,2,3}),({4,5,6})}); j=filter(i, #'sizeof); // filtert leere Arrays heraus j[0][0]=8;fuehrt zu: i==j==({({8,2,3}),({4,5,6})});
- Das Kopieren in das Rueckgabemapping erfolgt fuer jedes Element nach Ausfuehrung der Filtermethode. Aenderungen der Werte im Array in dieser Methode (globale Variable/Uebergabe als Referenz an filter) schlagen sich also im Rueckgabearray nieder.
- Fuer Arrays wirkt filter() wie filter_array(), fuer Mappings stellt filter() eine Verallgemeinerung von filter_indices() dar.
BEISPIELE¶
### Filtere alle Lebewesen in einem Raum in ein Array ###
filter(all_inventory(this_object()),#'living);
### Filtere alle tauben Spieler im Raum in ein Array ###
static int filter_isdeaf(object who) {
return (interactive(who) && who->QueryProp(P_DEAF));
}
filter(all_inventory(this_object()), #'filter_isdeaf);
### Filtern von Idlern (>=1 Sekunde idle) ###
// Folgend identische Resultate, aber andere Ansaetze:
#1: nutzt die Efun query_idle() als Lfun-Closure (ideal hier)
idle_usr = filter(users(), #'query_idle );
#2: mit Filtermethode
int check_if_idle(object user) {
return query_idle(user);
}
#2a: filtert mittels der Lfun im selben Objekt die Idler in das
Rueckgabearray
idle_usr = filter(users(), "check_if_idle");
idle_usr = filter(users(), "check_if_idle", this_object());
#2b: ruft die Lfun check_if_idle() als Lfun-Closure (Funktions-
pointer)
idle_usr = filter(users(), #'check_if_idle );
#3: Nutzt eine Inline-Closure
idle_usr = filter(users(), function int (object user) {
return query_idle(user);
} );
### Filtern von Idlern (>=20 Sekunden idle) mit Extraparameter ###
// Folgend identische Resultate, aber andere Ansaetze:
#1: die Efun koennen wir nicht mehr direkt nutzen, weil sie
diesen Parameter nicht unterstuetzt
// idle_usr = filter(users(), #'query_idle );
#2: mit separater Filtermethode ... mit neuem Parameter
int check_if_idle(object user, int length) {
return query_idle(user)>length;
}
#2a: filtert mittels der Lfun im selben Objekt die Idler in das
Rueckgabearray ... mit drittem Parameter!
idle_usr = filter(users(), "check_if_idle", this_object(), 20);
#2b: ruft die Lfun check_if_idle() als Lfun-Closure (Funktions-
pointer)
idle_usr = filter(users(), #'check_if_idle, 20);
#3: Nutzt eine Inline-Closure
idle_usr = filter(users(), function int (object user, int length) {
return (query_idle(user) > length);
}, 20);