機能オブジェクト

「機能オブジェクト」とは、通常、以下のいずれかを意味する:

ファンクション・オブジェクトは以下のように使用できる:

オブジェクトが呼び出し可能かどうかを判断するには、以下のいずれかを使用する:

User-Defined

ユーザー定義関数オブジェクトは、"関数 "の実装を含むCallメソッドを定義しなければならない。

class YourClassName {
    Call(a, b) {  ; Declare parameters as needed, or an array*.
        ;...
        return c
    }
    ;...
}

これは、YourClassName()が返すオブジェクトなど、YourClassNameインスタンスに適用されます。Callstatic Callに置き換えると、代わりにYourClassName自身が呼び出されたときに起こることがオーバーライドされる。

呼び出されると、配列の各要素を順番に呼び出す。

class FuncArrayType extends Array {
    Call(params*) {
        ; Call a list of functions.
        for fn in this
            fn(params*)
    }
}

; Create an array of functions.
funcArray := FuncArrayType()
; Add some functions to the array (can be done at any point).
funcArray.Push(One)
funcArray.Push(Two)
; Create an object which uses the array as a method.
obj := {method: funcArray}
; Call the method (and consequently both One and Two).
obj.method("2nd")
; Call it as a function.
(obj.method)("1st", "2nd")

One(param1, param2) {
    ListVars
    MsgBox
}
Two(param1, param2) {
    ListVars
    MsgBox
}

BoundFuncオブジェクト

関数のように動作するが、定義済みのパラメータを別の関数に渡すだけである。

BoundFuncオブジェクトを作成する方法は2つある:

BoundFuncオブジェクトは、以下の例のように呼び出すことができる。BoundFuncが呼び出されると、バインドされている関数やメソッドが呼び出され、バインドされているパラメータと呼び出し元のパラメータの組み合わせが渡される。未束縛のパラメータ位置は、呼び出し元のパラメータリストから左から右へと割り当てられる。事例:

fn := RealFn.Bind(1)  ; Bind first parameter only
fn(2)      ; 「1, 2」と表示します
fn.Call(3) ; 「1, 3」と表示します

fn := RealFn.Bind( , 1)  ; Bind second parameter only
fn(2, 0)   ; 「2, 1, 0」と表示します
fn.Call(3) ; 「3, 1」と表示します
fn(, 4)    ; Error: 'a' was omitted

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

ObjBindMethodは、メソッド自体への参照を取得できない場合でも、メソッドにバインドするために使用できます。事例:

Shell := ComObject("Shell.Application")
RunBox := ObjBindMethod(Shell, "FileRun")
; Show the Run dialog.
RunBox

より複雑な例については、SetTimerを参照のこと。

その他のプロパティやメソッドはFuncから継承されるが、対象となる関数やメソッドのプロパティは反映されない(関数として実装する必要はない)。BoundFuncは、以下のファット・アロー関数と同様に、他の正式なパラメーターを持たない無名バリアド関数として機能する:

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