MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | SYNOPSIS |
| 2 | unknown call_other(object ob, string fun, mixed arg, ...); |
| 3 | unknown call_other(object *ob, string fun, mixed arg, ...); |
| 4 | |
| 5 | ob->fun(mixed arg, ...); |
| 6 | ob->"fun"(mixed arg, ...); |
| 7 | ob->(fun)(mixed arg, ...); |
| 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 | |
| 15 | Optional kann der Driver so konfigueriert werden, dass auch ein Array |
| 16 | von Objekten *<ob> akzeptiert wird. Die Funktion <fun> wird dann fuer |
| 17 | jedes Objekt <ob> im Array mit den Argumenten <arg...> aufgerufen. |
| 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. |
| 23 | call_other() auf Arrays von Objekten ist im MG aktiviert, welches |
| 24 | durch das Define __LPC_ARRAY_CALLS__ angezeigt wird. |
| 25 | |
| 26 | Das Objekt (bzw. die Objekte) kann direkt oder ueber einen String |
| 27 | (d.h. den Objektnamen) angegeben werden. Wenn ein String angegeben |
| 28 | wird und das Objekt noch nicht existiert, wird es geladen. |
| 29 | |
| 30 | ob->fun(args) und "ob_name"->fun(args) sind aequivalent zu |
| 31 | call_other(ob, "fun", args). Heutzutage kann "ob_name" auch eine |
| 32 | Variable sein. ob->(fun)(args) ist aequivalent zu |
| 33 | call_other(ob, fun, args), wobei <fun> ein Runtime Ausdruck ist, |
| 34 | der den Funktionsnamen liefert. |
| 35 | |
| 36 | Wenn das Objekt <ob> keine oeffentliche Funktion mit dem Namen <fun> |
| 37 | enthaelt, gibt call_other() den Wert 0 zurueck. Dies ist nicht |
| 38 | unterscheidbar von einer Funktion <fun>, die 0 zurueck liefert. |
| 39 | Oeffentlich bedeutet "public", wenn andere Objekte aufgerufen |
| 40 | werden und "public" oder "static", wenn der Aufruf an this_object() |
| 41 | ergeht. Funktionen, die "private" oder "protected" definiert sind, |
| 42 | koennen niemals von call_other() aufgerufen werden. |
| 43 | |
| 44 | Der Rueckgabewert von call_other() ist standardmaessig 'any'. Falls |
| 45 | aber #pragma strict_types gesetzt ist, ist der Rueckgabewert |
| 46 | 'unknown', und das Resultat des call_other() muss zuerst auf einen |
| 47 | zutreffenden Variablentyp gecastet werden, bevor man es fuer etwas |
| 48 | verwenden kann. |
| 49 | |
| 50 | BEISPIELE |
| 51 | Die nachfolgenden Beispiele rufen alle die Funktion "QueryProp" auf |
| 52 | mit dem Argument P_SHORT. |
| 53 | |
| 54 | string str, fun; |
| 55 | str = (string)call_other(this_player(), "QueryProp", P_SHORT); |
| 56 | fun = "QueryProp"; |
| 57 | str = (string)call_other(this_player(), fun, P_SHORT); |
| 58 | |
| 59 | str = (string)this_player()->QueryProp(P_SHORT); |
| 60 | str = (string)this_player()->"QueryProp"(P_SHORT); |
| 61 | fun = "QueryProp"; |
| 62 | str = (string)this_player()->(fun)(P_SHORT); |
| 63 | |
| 64 | Solange #pragma strict_types gesetzt ist, muss man das Resultat von |
| 65 | call_other() explizit auf einen passenden Typ casten, weil |
| 66 | call_other() unknown liefert. |
| 67 | |
| 68 | Das folgende Statement ruft die lfun short() in allen aktiven |
| 69 | Benutzern auf und speichert das gesammelte Resultat in einer |
| 70 | Variablen: |
| 71 | |
| 72 | string * s; |
| 73 | s = (string *)users()->short(); |
| 74 | |
| 75 | Objekte laden (obsolet): |
| 76 | Compat: call_other("/users/luser/thing", "???", 0); |
| 77 | |
| 78 | Das sieht etwas merkwuerdig aus, wurde aber oft verwendet, um einfach |
| 79 | ein Objekt zu laden. Dazu wurde die (nicht existierende) Funktion |
| 80 | "???" im Objekt aufgerufen. Gluecklicherweise gibt es heute zu |
| 81 | diesem Zweck die Efun load_object(), also bitte nicht mehr verwenden. |
| 82 | |
| 83 | AENDERUNGEN |
| 84 | In LDMud 3.2.8 wurden die folgenden Verbesserungen eingefuehrt: |
| 85 | - die Formen x->"y"() und x->(y)() werden erkannt; |
| 86 | - die Form x->y() kollidiert nicht mehr mit einer lokalen Variablen, |
| 87 | die auch "y" heisst. |
| 88 | - eine simul_efun call_other() erwischt auch Aufrufe der Form ->(). |
| 89 | - call_other kann auch auf Arrays von Objekten angewandt werden. |
| 90 | LDMud 3.2.10 machte den Aufruf von Objektarrays konfigurierbar. |
| 91 | |
| 92 | SIEHE AUCH |
| 93 | function_exists(E), call_resolved(E), create(A), pragma(LPC), |
| 94 | extern_call(E), functions(LPC) |