「機能オブジェクト」とは、通常、以下のいずれかを意味する:
ファンクション・オブジェクトは以下のように使用できる:
オブジェクトが呼び出し可能かどうかを判断するには、以下のいずれかを使用する:
Value.HasMethod()
は、デフォルトではすべてのAutoHotkeyの値とオブジェクトで動作しますが、一部のオブジェクトやクラスではHasMethodをオーバーライドできます。COMオブジェクトの場合、COMオブジェクトが実際には別のプロセスのAutoHotkeyオブジェクトでない限り、これは通常失敗します(例外をスローするか、間違った結果を生成します)。HasMethod(Value)
は、すべてのAutoHotkeyの値およびオブジェクトで動作し、オーバーライドすることはできませんが、Callメソッドの存在を判断できない場合はfalseを返します。Valueが ComObjectの場合は例外がスローされる。ユーザー定義関数オブジェクトは、"関数 "の実装を含むCallメソッドを定義しなければならない。
class YourClassName { Call(a, b) { ; Declare parameters as needed, or an array*. ;... return c } ;... }
これは、YourClassName()
が返すオブジェクトなど、YourClassNameのインスタンスに適用されます。Call
を static 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オブジェクトを作成する方法は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*)) }