filter

BEMERKUNGEN

  1. 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})});
  1. 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.
  2. 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);