Funktionsobjekte

"Funktionsobjekt" bedeutet in der Regel folgendes:

Funktionsobjekte können mit folgenden Dingen verwendet werden:

Um zu prüfen, ob ein Objekt potenziell aufrufbar ist, verwenden Sie eine der folgenden Möglichkeiten:

Benutzerdefiniert

Benutzerdefinierte Funktionsobjekte müssen eine Call-Methode definieren, die die Implementierung von der "Funktion" enthält.

class MeineKlasseName {
    Call(a, b) {  ; Parameter je nach Bedarf deklarieren, oder ein Array*.
        ;...
        return c
    }
    ;...
}

Dies gilt für Instanzen von MeineKlasseName, wie z.B. das von MeineKlasseName() zurückgegebene Objekt. Das Ersetzen von Call mit static Call würde stattdessen überschreiben, was passiert, wenn MeineKlasseName selbst aufgerufen wird.

Beispiele

Das folgende Beispiel definiert ein aufrufbares Funktionsarray, das beim Aufruf jedes seiner Elemente der Reihe nach aufruft.

class FunkArrayTyp extends Array {
    Call(params*) {
        ; Eine Liste von Funktionen aufrufen.
        for fn in this
            fn(params*)
    }
}

; Ein Array von Funktionen erstellen.
FunkArray := FunkArrayTyp()
; Einige Funktionen in das Array einfügen (kann jederzeit gemacht werden).
FunkArray.Push(Eins)
FunkArray.Push(Zwei)
; Ein Objekt erstellen, das das Array als Methode verwendet.
obj := {Methode: FunkArray}
; Methode aufrufen (und folglich sowohl Eins als auch Zwei).
obj.Methode("2.")
; Als Funktion aufrufen.
(obj.Methode)("1.", "2.")

Eins(param1, param2) {
    ListVars
    MsgBox
}
Zwei(param1, param2) {
    ListVars
    MsgBox
}

BoundFunc-Objekt

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. Wenn das BoundFunc-Objekt aufgerufen wird, ruft es die Funktion oder Methode auf, an die es gebunden wurde, und übergibt eine Kombination aus gebundenen Parametern und Parametern des Aufrufers. Ungebundene Parameterpositionen werden Positionen aus der Parameterliste des Aufrufers zugewiesen, von links nach rechts. Zum Beispiel:

fn := EchteFn.Bind(1)  ; Nur ersten Parameter binden
fn(2)      ; Zeigt "1, 2"
fn.Call(3) ; Zeigt "1, 3"

fn := EchteFn.Bind( , 1)  ; Nur zweiten Parameter binden
fn(2, 0)   ; Zeigt "2, 1, 0"
fn.Call(3) ; Zeigt "3, 1"
fn(, 4)    ; Fehler: 'a' wurde weggelassen

EchteFn(a, b, c?) {
    MsgBox a ", " b (IsSet(c) ? ", " c : "")
}

Mit ObjBindMethod kann eine Methode gebunden werden, auch dann, wenn der Abruf einer Referenz zur Methode selbst nicht möglich ist. Zum Beispiel:

Shell := ComObject("Shell.Application")
RunBox := ObjBindMethod(Shell, "FileRun")
; Ausführen-Dialogfenster öffnen.
RunBox

Ein komplexeres Beispiel finden Sie unter SetTimer.

Andere Eigenschaften und Methoden werden von Func geerbt, spiegeln aber nicht die Eigenschaften der Zielfunktion oder -methode wider (die nicht als Funktion implementiert sein muss). Das BoundFunc-Objekt fungiert als anonyme variadische Funktion ohne weitere formale Parameter, ähnlich der Fat-Arrow-Funktion unten:

Func_Bind(fn, bound_args*) {
    return (args*) => (args.InsertAt(1, bound_args*), fn(args*))
}