Funktionsobjekte

"Funktionsobjekt" bedeutet in der Regel folgendes:

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

Benutzerdefiniert

Benutzerdefinierte Funktionsobjekte sollten dieses allgemeine Muster folgen:

class DeinKlassenname {
    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 Base-Klasse übertragen werden (aber sollten Sie jemals Ihren Code mit einem fremden Code kombinieren, müssen Sie eventuell mit Konflikten rechnen). Zum Beispiel:

class Funktionsobjekt {
    __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 aufgeruft werden kann; wenn man das Array aufruft, wird es jedes seiner Elemente nacheinander aufrufen.

class FunkArrayTyp extends Funktionsobjekt {
    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.