Funktionsobjekte

"Funktionsobjekt" bedeutet in der Regel folgendes:

Funktionsobjekte können mit folgenden Dingen verwendet werden:

Benutzerdefiniert

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:

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.

Beispiele

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
}

BoundFunc-Objekt [v1.1.20+]

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.