"Funktionsobjekt" bedeutet in der Regel folgendes:
Funktionsobjekte können mit folgenden Dingen verwendet werden:
Um zu prüfen, ob ein Objekt potenziell aufrufbar ist, verwenden Sie eine der folgenden Möglichkeiten:
Wert.HasMethod()
funktioniert standardmäßig mit allen AutoHotkey-Werten und -Objekten, lässt aber zu, dass HasMethod bei einigen Objekten oder Klassen überschrieben werden kann. Bei COM-Objekten wird dies in der Regel fehlschlagen (eine Ausnahme auslösen oder das falsche Ergebnis erzeugen), es sei denn, das COM-Objekt ist tatsächlich ein AutoHotkey-Objekt aus einem anderen Prozess.HasMethod(Wert)
funktioniert mit allen AutoHotkey-Werten und -Objekten und kann nicht überschrieben werden, gibt aber False zurück, wenn die Existenz einer Call-Methode nicht ermittelt werden kann. Es wird eine Ausnahme ausgelöst, wenn Wert ein ComObject ist.Benutzerdefinierte Funktionsobjekte müssen eine Call-Methode definieren, die die Implementierung von der "Funktion" enthält.
class MeineKlasseName { Call(a, b) { ; Parameter je nach Bedarf deklarieren, oder ein Array*. ;... return c } ;... }
Dies gilt für Instanzen von MeineKlasseName, wie z.B. das von MeineKlasseName()
zurückgegebene Objekt. Das Ersetzen von Call
mit static Call
würde stattdessen überschreiben, was passiert, wenn MeineKlasseName selbst aufgerufen wird.
Das folgende Beispiel definiert ein aufrufbares Funktionsarray, das beim Aufruf jedes seiner Elemente der Reihe nach aufruft.
class FunkArrayTyp extends Array { Call(params*) { ; Eine Liste von Funktionen aufrufen. for fn in this fn(params*) } } ; Ein Array von Funktionen erstellen. FunkArray := FunkArrayTyp() ; Einige Funktionen in das Array einfügen (kann jederzeit gemacht werden). FunkArray.Push(Eins) FunkArray.Push(Zwei) ; Ein Objekt erstellen, das das Array als Methode verwendet. obj := {Methode: FunkArray} ; Methode aufrufen (und folglich sowohl Eins als auch Zwei). obj.Methode("2.") ; Als Funktion aufrufen. (obj.Methode)("1.", "2.") Eins(param1, param2) { ListVars MsgBox } Zwei(param1, param2) { ListVars MsgBox }
Verhält sich wie eine Funktion, übergibt aber nur vordefinierte Parameter an eine andere Funktion.
BoundFunc-Objekte können auf zwei Arten erzeugt werden:
Das folgende Beispiel zeigt, wie BoundFunc-Objekte aufgerufen werden können. Wenn das BoundFunc-Objekt aufgerufen wird, ruft es die Funktion oder Methode auf, an die es gebunden wurde, und übergibt eine Kombination aus gebundenen Parametern und Parametern des Aufrufers. Ungebundene Parameterpositionen werden Positionen aus der Parameterliste des Aufrufers zugewiesen, von links nach rechts. Zum Beispiel:
fn := EchteFn.Bind(1) ; Nur ersten Parameter binden fn(2) ; Zeigt "1, 2" fn.Call(3) ; Zeigt "1, 3" fn := EchteFn.Bind( , 1) ; Nur zweiten Parameter binden fn(2, 0) ; Zeigt "2, 1, 0" fn.Call(3) ; Zeigt "3, 1" fn(, 4) ; Fehler: 'a' wurde weggelassen EchteFn(a, b, c?) { MsgBox a ", " b (IsSet(c) ? ", " c : "") }
Mit ObjBindMethod kann eine Methode gebunden werden, auch dann, wenn der Abruf einer Referenz zur Methode selbst nicht möglich ist. Zum Beispiel:
Shell := ComObject("Shell.Application") RunBox := ObjBindMethod(Shell, "FileRun") ; Ausführen-Dialogfenster öffnen. RunBox
Ein komplexeres Beispiel finden Sie unter SetTimer.
Andere Eigenschaften und Methoden werden von Func geerbt, spiegeln aber nicht die Eigenschaften der Zielfunktion oder -methode wider (die nicht als Funktion implementiert sein muss). Das BoundFunc-Objekt fungiert als anonyme variadische Funktion ohne weitere formale Parameter, ähnlich der Fat-Arrow-Funktion unten:
Func_Bind(fn, bound_args*) { return (args*) => (args.InsertAt(1, bound_args*), fn(args*)) }