MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 1 | SYNOPSIS |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 2 | unknown call_other(object ob, string fun, mixed arg, ...) |
| 3 | unknown call_other(object *ob, string fun, mixed arg, ...) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 4 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 5 | ob->fun(mixed arg, ...) |
| 6 | ob->"fun"(mixed arg, ...) |
| 7 | ob->(fun)(mixed arg, ...) |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 8 | |
| 9 | BESCHREIBUNG |
| 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 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 15 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 18 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 23 | |
| 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 | |
| 48 | BEISPIELE |
| 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 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 70 | string *s; |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 71 | s = (string *)users()->short(); |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 72 | !Compat: call_other("/users/luser/thing", "???", 0); |
| 73 | Compat: call_other("users/luser/thing", "???", 0); |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 74 | |
| 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 |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 78 | diesem Zweck die Efun load_object(). |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 79 | |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 80 | GESCHICHTE |
MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 81 | 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. |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 88 | 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 User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame] | 90 | |
| 91 | SIEHE AUCH |
Zesstra | d59c389 | 2019-11-28 20:53:39 +0100 | [diff] [blame] | 92 | 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) |