blob: ee6ebdd53ddf230d16dcab0ef2b9db71c4ba4e49 [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001SYNOPSIS
Zesstrad59c3892019-11-28 20:53:39 +01002 unknown call_other(object ob, string fun, mixed arg, ...)
3 unknown call_other(object *ob, string fun, mixed arg, ...)
MG Mud User88f12472016-06-24 23:31:02 +02004
Zesstrad59c3892019-11-28 20:53:39 +01005 ob->fun(mixed arg, ...)
6 ob->"fun"(mixed arg, ...)
7 ob->(fun)(mixed arg, ...)
MG Mud User88f12472016-06-24 23:31:02 +02008
9BESCHREIBUNG
10 Ruft die in einem anderen Objekt <ob> die Funktion <fun> mit den
11 Argumenten <arg...> auf und gibt den Wert zurueck, der von der
12 Funktion <fun> geliefert wird (oder 0 fuer nicht existierende oder
13 als void deklarierte Funktionen).
14
Zesstrad59c3892019-11-28 20:53:39 +010015 Weiterhin wird auch ein Array von Objekten *<ob> akzeptiert. Die
16 Funktion <fun> wird dann fuer jedes Objekt <ob> im Array mit den
17 Argumenten <arg...> aufgerufen.
MG Mud User88f12472016-06-24 23:31:02 +020018 Die einzelnen Resultate werden in einem Array zusammen gefasst und
19 dieses Array dann als Endresultat von call_other() zurueck gegeben.
20 Die Elemente von *<ob> koennen Objekte oder Namen von Objekten sein.
21 Zerstoerte Objekte und 0 als Element geben eine 0 zurueck, fuehren
22 aber nicht zu einem Fehler.
MG Mud User88f12472016-06-24 23:31:02 +020023
24 Das Objekt (bzw. die Objekte) kann direkt oder ueber einen String
25 (d.h. den Objektnamen) angegeben werden. Wenn ein String angegeben
26 wird und das Objekt noch nicht existiert, wird es geladen.
27
28 ob->fun(args) und "ob_name"->fun(args) sind aequivalent zu
29 call_other(ob, "fun", args). Heutzutage kann "ob_name" auch eine
30 Variable sein. ob->(fun)(args) ist aequivalent zu
31 call_other(ob, fun, args), wobei <fun> ein Runtime Ausdruck ist,
32 der den Funktionsnamen liefert.
33
34 Wenn das Objekt <ob> keine oeffentliche Funktion mit dem Namen <fun>
35 enthaelt, gibt call_other() den Wert 0 zurueck. Dies ist nicht
36 unterscheidbar von einer Funktion <fun>, die 0 zurueck liefert.
37 Oeffentlich bedeutet "public", wenn andere Objekte aufgerufen
38 werden und "public" oder "static", wenn der Aufruf an this_object()
39 ergeht. Funktionen, die "private" oder "protected" definiert sind,
40 koennen niemals von call_other() aufgerufen werden.
41
42 Der Rueckgabewert von call_other() ist standardmaessig 'any'. Falls
43 aber #pragma strict_types gesetzt ist, ist der Rueckgabewert
44 'unknown', und das Resultat des call_other() muss zuerst auf einen
45 zutreffenden Variablentyp gecastet werden, bevor man es fuer etwas
46 verwenden kann.
47
48BEISPIELE
49 Die nachfolgenden Beispiele rufen alle die Funktion "QueryProp" auf
50 mit dem Argument P_SHORT.
51
52 string str, fun;
53 str = (string)call_other(this_player(), "QueryProp", P_SHORT);
54 fun = "QueryProp";
55 str = (string)call_other(this_player(), fun, P_SHORT);
56
57 str = (string)this_player()->QueryProp(P_SHORT);
58 str = (string)this_player()->"QueryProp"(P_SHORT);
59 fun = "QueryProp";
60 str = (string)this_player()->(fun)(P_SHORT);
61
62 Solange #pragma strict_types gesetzt ist, muss man das Resultat von
63 call_other() explizit auf einen passenden Typ casten, weil
64 call_other() unknown liefert.
65
66 Das folgende Statement ruft die lfun short() in allen aktiven
67 Benutzern auf und speichert das gesammelte Resultat in einer
68 Variablen:
69
Zesstrad59c3892019-11-28 20:53:39 +010070 string *s;
MG Mud User88f12472016-06-24 23:31:02 +020071 s = (string *)users()->short();
Zesstrad59c3892019-11-28 20:53:39 +010072 !Compat: call_other("/users/luser/thing", "???", 0);
73 Compat: call_other("users/luser/thing", "???", 0);
MG Mud User88f12472016-06-24 23:31:02 +020074
75 Das sieht etwas merkwuerdig aus, wurde aber oft verwendet, um einfach
76 ein Objekt zu laden. Dazu wurde die (nicht existierende) Funktion
77 "???" im Objekt aufgerufen. Gluecklicherweise gibt es heute zu
Zesstrad59c3892019-11-28 20:53:39 +010078 diesem Zweck die Efun load_object().
MG Mud User88f12472016-06-24 23:31:02 +020079
Zesstrad59c3892019-11-28 20:53:39 +010080GESCHICHTE
MG Mud User88f12472016-06-24 23:31:02 +020081 In LDMud 3.2.8 wurden die folgenden Verbesserungen eingefuehrt:
82 - die Formen x->"y"() und x->(y)() werden erkannt;
83 - die Form x->y() kollidiert nicht mehr mit einer lokalen Variablen,
84 die auch "y" heisst.
85 - eine simul_efun call_other() erwischt auch Aufrufe der Form ->().
86 - call_other kann auch auf Arrays von Objekten angewandt werden.
87 LDMud 3.2.10 machte den Aufruf von Objektarrays konfigurierbar.
Zesstrad59c3892019-11-28 20:53:39 +010088 LDMud 3.3.113 fuehrte den Hook H_DEFAULT_METHOD ein.
89 LDMud 3.5.0 machte den Aufruf von Objektarrays nicht mehr optional.
MG Mud User88f12472016-06-24 23:31:02 +020090
91SIEHE AUCH
Zesstrad59c3892019-11-28 20:53:39 +010092 call_direct(E), call_direct_resolved(E), call_resolved(E), create(A),
93 pragma(LPC), extern_call(E), function_exists(E), functions(LPC),
94 map_objects(E)