"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.