Funktionsobjekte

"Funktionsobjekt" bedeutet in der Regel folgendes:

Funktionsobjekte können in Verbindung mit folgenden Dingen verwendet werden:

Benutzerdefiniert

Benutzerdefinierte Funktionsobjekte sollten diesem allgemeinen Muster folgen:

class MeineKlasseName {
    Call(a, b) {  ; Deklariere Parameter je nach Bedarf, 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 Nutzung ab:

Die Arbeit kann auch direkt in __Call erfolgen. Allerdings wird das Weiterleiten von __Call nach Call empfohlen, um den Übergang zu AutoHotkey v2 zu erleichtern, weil in dieser Version das Verhalten von %this%() und Methodenaufrufen geändert wird, um die Call-Methode direkt aufzurufen.

Beispiele

Wenn Sie mehrere Funktionsobjekttypen definieren, sollte der Standardcode auf eine Basisklasse übertragen werden (aber sollten Sie jemals Ihren Code mit einem fremden Code kombinieren, müssen Sie eventuell mit Konflikten rechnen). 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 Funktions-Array, das aufgerufen werden kann; wenn man das Array aufruft, wird es jedes seiner Elemente nacheinander aufrufen.

; Dieses Beispiel benötigt die FunktionObjekt-Klasse von oben, um zu funktionieren.
class FunkArrayTyp extends FunktionObjekt {
    Call(obj, params*) {
        ; Ruft eine Liste von Funktionen auf.
        Loop % this.Length()
            this[A_Index].Call(params*)
    }
}

; Erstellt ein Array mit Funktionen.
FunkArray := new FunkArrayTyp
; Fügt einige Funktionen in das Array ein (kann jederzeit gemacht werden).
FunkArray.Push(Func("Eins"))
FunkArray.Push(Func("Zwei"))
; Erstellt ein Objekt, das das Array als Methode benutzt.
obj := {Methode: FunkArray}
; Ruft die Methode auf.
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, aber übergibt nur vordefinierte Parameter an eine andere Funktion.

Es gibt zwei Möglichkeiten, wie BoundFunc-Objekte erstellt werden können:

Im unteren Beispiel wird gezeigt, wie BoundFunc-Objekte aufgerufen werden können. Anderen Methoden werden nicht unterstützt. Wenn das BoundFunc-Objekt aufgerufen wird, ruft es die Funktion oder Methode auf, an der es gebunden wurde, und übergibt alle gebundenen Parameter, gefolgt von denen, die vom Aufrufer übergeben wurden. 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 mit einem Objekt verbunden werden, wenn eine Referenz zu der Methode selbst nicht abgerufen werden kann. Zum Beispiel:

File := FileOpen(A_ScriptFullPath, "r")
ZeileAbrufen := ObjBindMethod(File, "ReadLine")
MsgBox % %ZeileAbrufen%()  ; Zeigt die erste Zeile dieser Datei.

Ein komplexeres Beispiel finden Sie bei SetTimer.