SYNOPSIS unknown call_other(object ob, string fun, mixed arg, ...) unknown call_other(object *ob, string fun, mixed arg, ...) ob->fun(mixed arg, ...) ob->"fun"(mixed arg, ...) ob->(fun)(mixed arg, ...) BESCHREIBUNG Ruft die in einem anderen Objekt die Funktion mit den Argumenten auf und gibt den Wert zurueck, der von der Funktion geliefert wird (oder 0 fuer nicht existierende oder als void deklarierte Funktionen). Weiterhin wird auch ein Array von Objekten * akzeptiert. Die Funktion wird dann fuer jedes Objekt im Array mit den Argumenten aufgerufen. Die einzelnen Resultate werden in einem Array zusammen gefasst und dieses Array dann als Endresultat von call_other() zurueck gegeben. Die Elemente von * koennen Objekte oder Namen von Objekten sein. Zerstoerte Objekte und 0 als Element geben eine 0 zurueck, fuehren aber nicht zu einem Fehler. Das Objekt (bzw. die Objekte) kann direkt oder ueber einen String (d.h. den Objektnamen) angegeben werden. Wenn ein String angegeben wird und das Objekt noch nicht existiert, wird es geladen. ob->fun(args) und "ob_name"->fun(args) sind aequivalent zu call_other(ob, "fun", args). Heutzutage kann "ob_name" auch eine Variable sein. ob->(fun)(args) ist aequivalent zu call_other(ob, fun, args), wobei ein Runtime Ausdruck ist, der den Funktionsnamen liefert. Wenn das Objekt keine oeffentliche Funktion mit dem Namen enthaelt, gibt call_other() den Wert 0 zurueck. Dies ist nicht unterscheidbar von einer Funktion , die 0 zurueck liefert. Oeffentlich bedeutet "public", wenn andere Objekte aufgerufen werden und "public" oder "static", wenn der Aufruf an this_object() ergeht. Funktionen, die "private" oder "protected" definiert sind, koennen niemals von call_other() aufgerufen werden. Der Rueckgabewert von call_other() ist standardmaessig 'any'. Falls aber #pragma strict_types gesetzt ist, ist der Rueckgabewert 'unknown', und das Resultat des call_other() muss zuerst auf einen zutreffenden Variablentyp gecastet werden, bevor man es fuer etwas verwenden kann. BEISPIELE Die nachfolgenden Beispiele rufen alle die Funktion "QueryProp" auf mit dem Argument P_SHORT. string str, fun; str = (string)call_other(this_player(), "QueryProp", P_SHORT); fun = "QueryProp"; str = (string)call_other(this_player(), fun, P_SHORT); str = (string)this_player()->QueryProp(P_SHORT); str = (string)this_player()->"QueryProp"(P_SHORT); fun = "QueryProp"; str = (string)this_player()->(fun)(P_SHORT); Solange #pragma strict_types gesetzt ist, muss man das Resultat von call_other() explizit auf einen passenden Typ casten, weil call_other() unknown liefert. Das folgende Statement ruft die lfun short() in allen aktiven Benutzern auf und speichert das gesammelte Resultat in einer Variablen: string *s; s = (string *)users()->short(); !Compat: call_other("/users/luser/thing", "???", 0); Compat: call_other("users/luser/thing", "???", 0); Das sieht etwas merkwuerdig aus, wurde aber oft verwendet, um einfach ein Objekt zu laden. Dazu wurde die (nicht existierende) Funktion "???" im Objekt aufgerufen. Gluecklicherweise gibt es heute zu diesem Zweck die Efun load_object(). GESCHICHTE In LDMud 3.2.8 wurden die folgenden Verbesserungen eingefuehrt: - die Formen x->"y"() und x->(y)() werden erkannt; - die Form x->y() kollidiert nicht mehr mit einer lokalen Variablen, die auch "y" heisst. - eine simul_efun call_other() erwischt auch Aufrufe der Form ->(). - call_other kann auch auf Arrays von Objekten angewandt werden. LDMud 3.2.10 machte den Aufruf von Objektarrays konfigurierbar. LDMud 3.3.113 fuehrte den Hook H_DEFAULT_METHOD ein. LDMud 3.5.0 machte den Aufruf von Objektarrays nicht mehr optional. SIEHE AUCH call_direct(E), call_direct_resolved(E), call_resolved(E), create(A), pragma(LPC), extern_call(E), function_exists(E), functions(LPC), map_objects(E)