"Funktionsobjekt" bedeutet in der Regel folgendes:
Funktionsobjekte können mit folgenden Dingen verwendet werden:
Benutzerdefinierte Funktionsobjekte sollten diesem allgemeinen Muster folgen:
class MeineKlasseName { Call(a, b) { ; Parameter je nach Bedarf deklarieren, oder ein Array*. ;... } __Call(Methode, args*) { if (Methode = "") ; Für %fn%() oder fn.() return this.Call(args*) if (IsObject(Methode)) ; Wenn dieses Funktionsobjekt als Methode verwendet wird. return this.Call(Methode, args*) } ;... }
Welche Teile genau benötigt werden, hängt von der Verwendung ab:
Methode
ist eine leere Zeichenkette, wenn das Skript %this%()
oder this.()
verwendet.IsObject(Methode)
einen Wert ungleich 0 zurück und Methode
enthält eine Referenz zum Zielobjekt. Wenn z.B. x.y
auf das Funktionsobjekt this
verweist, dann gilt x.y()
→ this[x]()
→ this.__Call(x)
→ this.Call(x)
.Die Arbeit kann auch direkt in __Call erledigt werden. Es wird jedoch empfohlen, __Call auf Call umzuleiten, um den Umstieg auf AutoHotkey v2 zu erleichtern, da dort %this%()
und Methodenaufrufe die Call-Methode direkt aufrufen.
Wenn Sie mehrere Funktionsobjekttypen definieren, sollte Boilerplate-Code an eine Basisklasse delegiert werden (aber wenn Sie Ihren Code jemals mit dem eines anderen kombinieren, sollten Sie auf Konflikte achten). Zum Beispiel:
class FunktionObjekt { __Call(Methode, args*) { if (Methode = "") return this.Call(args*) if (IsObject(Methode)) return this.Call(Methode, args*) } }
Das folgende Beispiel definiert ein aufrufbares Funktionsarray, das beim Aufruf jedes seiner Elemente der Reihe nach aufruft.
; Dieses Beispiel benötigt die FunktionObjekt-Klasse von oben, um zu funktionieren. class FunkArrayTyp extends FunktionObjekt { Call(obj, params*) { ; Eine Liste von Funktionen aufrufen. Loop % this.Length() this[A_Index].Call(params*) } } ; Ein Array von Funktionen erstellen. FunkArray := new FunkArrayTyp ; Einige Funktionen in das Array einfügen (kann jederzeit gemacht werden). FunkArray.Push(Func("Eins")) FunkArray.Push(Func("Zwei")) ; Ein Objekt erstellen, das das Array als Methode verwendet. obj := {Methode: FunkArray} ; Die Methode aufrufen. obj.Methode("foo", "bar") 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. Es werden keine anderen Methoden unterstützt. Wenn das BoundFunc-Objekt aufgerufen wird, ruft es die Funktion oder Methode auf, an die es gebunden wurde, und übergibt alle gebundenen Parameter, gefolgt von den vom Aufrufer übergebenen Parametern. Zum Beispiel:
fn := Func("EchteFn").Bind(1) %fn%(2) ; Zeigt "1, 2" fn.Call(3) ; Zeigt "1, 3" EchteFn(a, b) { MsgBox %a%, %b% }
Mit ObjBindMethod() kann eine Methode gebunden werden, wenn der Abruf einer Referenz zur Methode selbst nicht möglich ist. Zum Beispiel:
File := FileOpen(A_ScriptFullPath, "r") ZeileAbrufen := ObjBindMethod(File, "ReadLine") MsgBox % %ZeileAbrufen%() ; Zeigt die erste Zeile dieser Datei.
Ein komplexeres Beispiel finden Sie unter SetTimer.